Golang 中的陷阱 -- 0000

这个系列介绍 Golang 中的那些坑,不知道 4 位数的编号够用不 😂!本篇是关于 defer 的。


defer 是 Golang 的一个语法特性,可以让你在函数结束之后执行某些预设的操作,比如在函数结束时,关闭打开的文件。但就这个非常有用的东西,隐藏了许多的坑。

今天的坑从下面这个代码看起:

func test() {
    i := 0
    defer fmt.Println(i)
    i = 1
}

你猜猜 test 这个函数会输出什么呢?没错,就是输出 0。

这是因为要 defer 的函数在声明 defer 语句时就已经确定形参了,在这个例子中就是 0。所以最后在函数结束时会打印出 0。

如上面的例子中,在 defer 之后修改了 i 的值,而我们又是想要输出最终的 i 的值,那怎么办呢?我通常的做法是包裹一层匿名函数:

func test() {
    i := 0
    defer func() {
        fmt.Println(i)
    }()
    i = 1
}

这是因为在执行到 defer 语句时,匿名函数内部并没有执行,直到最后该匿名函数真正开始执行。

你有没有被坑到呢?

hah
Copyleft - All rights reversed. The internet is free and so is my content.