defer和fmt.Println

tyonc · · 807 次点击
打印指针。 ``` func main() { var i = new(int) defer func(i *int) { fmt.Printf("3:%p,%v\n", i, *i) }(i) defer fmt.Printf("2:%p,%v\n", i, *i) *i++ fmt.Printf("1:%p,%v\n", i, *i) } //1:0x1400001c0a0,1 //2:0x1400001c0a0,0 //3:0x1400001c0a0,1 ```
#1
更多评论
defer 栈结构, 3闭包 ,2.不是很清楚,做了自己个断点看看源码吧。 有没有大佬来解? func main() { var i = new(int) *i = 5 defer func(i *int) { fmt.Printf("3:%p,%v\n", i, *i) }(i) *i = 500 defer fmt.Printf("2:%p,%v\n", i, *i) *i = 50 /*defer func() { //fmt.Println(i, *i) fmt.Printf("2:%p,%v\n", i, *i) }()*/ *i++ fmt.Printf("1:%p,%v\n", i, *i) }
#2
defer你可以把它理解为一个栈,先进后出。进栈的是什么,出栈的就是什么 ```golang defer func(i *int) { fmt.Printf("3:%p,%v\n", i, *i) }(i) ``` 这里匿名函数的参数是变量**i**的指针地址,打印的是指针地址存放的值,最后变量**i**的值是1,那么这里输出的也是1 ```golang defer fmt.Printf("2:%p,%v\n", i, *i) ``` 这里压入栈的变量**i**的值是0,指针地址没有变化,所以输出的就是0 golang传的都是值拷贝,要么是拷贝指针的地址,要么是拷贝变量的值。(通常函数内部不会改变变量的值包括指针的地址,除非使用了unsafe包里的方法改变了指针的地址)
#3