Go面试题19
1: 下面代码段输出什么?
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.age = 29
}
参考答案及解析
答案: 29 29 28
. 变量person
是一个指针变量.
1: person.age
此时是将28
当做defer
函数的参数, 会把28
缓存在栈中, 等到最后执行该defer
语句的时候取出,即输出28
;
2: defer
缓存的是结构体Person{28}
的地址,最终Person{28}
的age
被重新赋值为29
,所以defer
语句最后执行的时候,依靠缓存的地址取出age
便是29
,即输出29
;
3: 闭包引用, 输出29
;
又由于defer
的执行顺序为先进后出,即3 2 1
,所以输出29 29 28
.
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付