下面代码输出什么?
type Person struct {
age int
}
func main() {
person := &Person{28}
// 1.
defer fmt.Println(person.age)
// 2.
defer func(p *Person) {
fmt.Println(p.age)
}(person)
// 3.
defer func() {
fmt.Println(person.age)
}()
person = &Person{29}
}
打卡
m
m
到
di
29 28 28
m
mark
打卡
三个28
也就是函数传参的都变了,对吧
m
mark,
mk
打卡
艹,坑王
打卡。。。。。。。。。
注意第二个defer
defer的使用
1.person.age 缓存在栈 输出 28 2.defer 缓存Person{28} 地址,这个地址指向的结构体没有被改变,最后 defer 语句后面的函数执行的时候取出仍是 28; 3.闭包引用,person 的值已经被改变,指向结构体 Person{29},所以输出 29.
mark
可以跟Go每日一题(75)对比学习
defer 缓存 结构体 地址
缓存 缓存 闭包
mark
mark
person.age 缓存在栈 输出 28 2.defer 缓存Person{28} 地址,这个地址指向的结构体没有被改变,最后 defer 语句后面的函数执行的时候取出仍是 28; 3.闭包引用,person 的值已经被改变,指向结构体 Person{29},所以输出 29.
怎么反反复复都是这几个题目啊。。。
mark
1
打卡学习
打卡, 闭包+defer
mark
最近题目有点糊弄了奥
mark
16楼 @brothersam 继续掉坑
m
mark
mark
my error
mark 学到了
mark
掉坑里了
为什么闭包就是29 萌新不懂就问
29 28 28 ; person = &Person{29} 是一个新的指针
29 28 28
打卡,defer的执行顺序为先进后出