Go面试题20

Posted by     "" on Wednesday, December 25, 2019

Go面试题20

1: 下面这段代码正确的输出是什么?

func f() {
    defer fmt.Println("D")
    fmt.Println("F")
}

func main() {
    f()
    fmt.Println("M")
}
  • A. F M D
  • B. D F M
  • C. F D M

2: 下面代码输出什么?

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}

}

参考答案及解析

1: 答案及解析: C.被调用函数里的defer语句在返回之前就会被执行,所以输出顺序是F D M.
2: 答案及解析: 29 28 28. 这道题在上一篇的基础上做了一点改动.上一篇最后一行代码person.age = 29是修改引用对象的成员age,这题最后一行代码person = &Person{29} 是修改引用对象本身,来看看有什么区别:

1person.age 这行代码跟之前含义是一样, 此时是将28当做defer函数的参数,会把28缓存在栈中,等到最后执行该defer语句的时候取出,即输出28;
2defer 缓存的是结构体Person{28}的地址,这个地址指向的结构体没有被改变, 最后defer语句后面的函数执行的时候取出仍是28.
3处 闭包引用, person的值已经被改变,指向结构体Persion{29},所以输出29.

由于defer的执行顺序为先进后出,即3 2 1, 所以输出29 28 28.

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

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