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--

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

Comments