package main
import "fmt"
func main() {
message := "消息1"
defer func() {
fmt.Println("第一个defer:", message)
}()
message = "消息改变了"
defer func(m string) {
fmt.Println("第二个defer:", m)
message = "消息又改变了"
}(message)
message = "消息2"
}
有趣的defer,试着注释其中某些行,猜猜最终输出的是什么。
有疑问加站长微信联系(非本文作者)

第二个defer:消息改变了 第一个defer:消息2
运行结果如下: 第二个defer: 消息改变了 第一个defer: 消息又改变了
不明白为什么不是: 第二个defer: 消息2 第一个defer: 消息又改变了
加断点调试会清楚些
个人的一点见解
在上面的中,这部分应该是一个
代码块
也就是说你在声明 defer 函数的时候,参数已经被复制并传入到函数中,这时候 message 已经是确定的,它已经不是你全局持有的 message 变量了。
怎么验证呢,你可以传递字符串指针进去。
因为指针只是保留的引用,存储着字符串的内存地址,所以它的状态会是一致的。代码会输出
1、函数的参数是值传递 2、defer执行 按照先进后出
第二个defer是传入的时候就确定了的,第一个defer是闭包