2.1.5 函数使用的常见注意事项

一、返回值被屏蔽

  1. Go语言的局部作用域中,命名的返回值会被同名的局部变量屏蔽

    func Func() (err error) {
    	if err := Bar(); err != nil {
    		return 
    	}
    	return 
    }

二、recover()函数必须在defer函数中运行

  1. 需要注意的是,recover()函数捕获的是祖父调用时的异常,直接调用时无效

    func main() {
        recover()
        panic(6)
    }
  2. 直接defer调用也是无效的:

    func main() {
        defer recover()
        panic(6)
    }
  3. defer时,多层嵌套依然无效

    func main() {
        defer func() {
            func() {
                revocer()
            }
        }()
        panic(6)
    }
  4. 必须在defer函数中直接调用才有效

    func main() {
        defer func() {
            recover()
        }()
        panic(6)
    }

三、闭包错误引用同一个变量

  1. 在Go语言中,在比包中使用变量容易混淆

  2. 案例:当想打印一个倒序的数字时,如果通过如下代码实现,则实际返回结果全会是3

    结果

  3. 如果想要实现循环,则需要传入闭包的参数:

    结果

四、在循环内部执行defer语句

  1. 在Go语言中,defer在函数退出时才执行,在for循环中执行defer会导致资源延迟释放

  2. 解决办法是,可以在for循环中构造一个局部函数,在局部函数内部执行defer

Last updated