2.1.5 函数使用的常见注意事项
一、返回值被屏蔽
Go语言的局部作用域中,命名的返回值会被同名的局部变量屏蔽
func Func() (err error) { if err := Bar(); err != nil { return } return }
二、recover()函数必须在defer函数中运行
recover()函数必须在defer函数中运行需要注意的是,
recover()函数捕获的是祖父调用时的异常,直接调用时无效func main() { recover() panic(6) }直接defer调用也是无效的:
func main() { defer recover() panic(6) }defer时,多层嵌套依然无效
func main() { defer func() { func() { revocer() } }() panic(6) }必须在defer函数中直接调用才有效
func main() { defer func() { recover() }() panic(6) }
三、闭包错误引用同一个变量
在Go语言中,在比包中使用变量容易混淆
案例:当想打印一个倒序的数字时,如果通过如下代码实现,则实际返回结果全会是3
结果
如果想要实现循环,则需要传入闭包的参数:
结果
四、在循环内部执行defer语句
defer语句在Go语言中,defer在函数退出时才执行,在for循环中执行defer会导致资源延迟释放
解决办法是,可以在for循环中构造一个局部函数,在局部函数内部执行defer
Last updated