求解为啥defer输出的不是最终值?
package main
import "fmt"
func main() {
var i = new(int)
defer func(i *int) {
fmt.Println("3:", *i)
}(i)
defer fmt.Println("2:", *i)
*i++
fmt.Println("1:", *i)
}
//1: 1
//2: 0
//3: 1
我猜应该是和println接收的interface有关,但是不是很肯定和原因是什么?谢谢了。
有疑问加站长微信联系(非本文作者)

打印指针。
defer 栈结构, 3闭包 ,2.不是很清楚,做了自己个断点看看源码吧。 有没有大佬来解?
func main() { var i = new(int)
}
defer你可以把它理解为一个栈,先进后出。进栈的是什么,出栈的就是什么
这里匿名函数的参数是变量i的指针地址,打印的是指针地址存放的值,最后变量i的值是1,那么这里输出的也是1
这里压入栈的变量i的值是0,指针地址没有变化,所以输出的就是0
golang传的都是值拷贝,要么是拷贝指针的地址,要么是拷贝变量的值。(通常函数内部不会改变变量的值包括指针的地址,除非使用了unsafe包里的方法改变了指针的地址)
延迟的是函数执行,defer声明时参数就计算确定了