Go面试题19

Posted by     "" on Wednesday, December 25, 2019

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.

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

使用微信扫描二维码完成支付