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 15:49:38,并被添加「golang」标签。
本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。tools更多说明 »
提醒:本文最后更新于 391 天前,文中所描述的信息可能已发生改变,请谨慎使用。
Comments