golang-defer使用

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 等待结束

可以看到依然能拿到更新后的结果;

本文链接:参与评论 »

--EOF--

提醒:本文最后更新于 498 天前,文中所描述的信息可能已发生改变,请谨慎使用。

Comments