golang 程序中函数执行的最后常常会执行一些操作,比如捕获异常,清理资源就会用到defer,如果使用不当可能会导致问题,下面来进行举例做个探索: defer 所在行之前声明的变量在defer 函数后被修改,打印的变量值会改变吗? package main
import ( “fmt”
)
func main() { content := “origin data “
defer func() {
readData(content)
}()
content = "new data "
fmt.Println("重新赋值后结果: ", content)
}
func readData(content string) { fmt.Println(“readData 更新后的数据是: “, content) }
运行结果: 重新赋值后结果: new data readData 更新后的数据是: new data
从上可以看到,虽然content在defer 之后被更新,但是依然能读到更新之后的数据; 如果defer函数执行使用的是异步执行,那么是否读取到最新的数据? 我们将代码改为如下: package main
import ( “fmt” “log” “sync” )
var wg = &sync.WaitGroup{}
func main() { content := “origin data “ wg.Add(1) defer func() { go readData(content, wg) log.Println(“执行等待。。。 “)
log.Println("等待结束")
wg.Wait()
}()
content = "new data "
fmt.Println("重新赋值后结果: ", content)
}
func readData(content string, wg *sync.WaitGroup) { fmt.Println(“readData 更新后的数据是: “, content) wg.Done() }
执行结果如下: 重新赋值后结果: new data readData 更新后的数据是: new data 2023/05/10 15:44:26 执行等待。。。 2023/05/10 15:44:26 等待结束
可以看到依然能拿到更新后的结果;
本文链接:https://iokde.com/post/golang-defer.html,参与评论 »
--EOF--
发表于 2023-05-10 08:00:00。
本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。更多说明 »
提醒:本文最后更新于 498 天前,文中所描述的信息可能已发生改变,请谨慎使用。
Comments