Go 面试每天一篇(第 21 天)

 

你好哇,今天是节前最后一天,提前祝大家中秋愉快,假期玩的开心!还有一件事告诉大家,《每天一篇》在放假期间会停更三天!平日里我们必须努力上班、学习成长,放了假就好好休息放松、调整好状态,节后我们再继续奋斗!

来看下昨天题目的解析:

1.参考答案及解析:C。被调用函数里的 defer 语句在返回之前就会被执行,所以输出顺序是 F D M。

2.参考答案及解析:29 28 28。这道题在第 19 天题目的基础上做了一点点小改动,前一题最后一行代码 person.age = 29 是修改引用对象的成员 age,这题最后一行代码 person = &Person{29} 是修改引用对象本身,来看看有什么区别。

1处.person.age 这一行代码跟之前含义是一样的,此时是将 28 当做 defer 函数的参数,会把 28 缓存在栈中,等到最后执行该 defer 语句的时候取出,即输出 28;

2处.defer 缓存的是结构体 Person{28} 的地址,这个地址指向的结构体没有被改变,最后 defer 语句后面的函数执行的时候取出仍是 28;

3处.闭包引用,person 的值已经被改变,指向结构体 Person{29},所以输出 29.

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

欢迎在留言区补充!

看下今天的题目:
1.下面的两个切片声明中有什么区别?哪个更可取?

A. var a []int
B. a := []int{}


2. A、B、C、D 哪些选项有语法错误?

type S struct {
}

func f(x interface{}) {
}

func g(x *interface{}) {
}

func main() {
    s := S{}
    p := &s
    f(s) //A
    g(s) //B
    f(p) //C
    g(p) //D
}

3.下面 A、B 两处应该填入什么代码,才能确保顺利打印出结果?

type S struct {
    m string
}

func f() *S {
    return __  //A
}

func main() {
    p := __    //B
    fmt.Println(p.m) //print "foo"
}

 

答案以及解析会在下一篇文章中给出,鼓励大家在留言区留下答案,抱团学习,日拱一卒,每天进步一点!

 

所有学习上的成功,都只依靠两件事 -- 策略和坚持,而坚持本身就是最重要的策略!

 

推荐阅读:

5 年 Gopher 都不知道的 defer 细节,你别再掉进坑里!

指针与引用

不一样的成功启示录

 

如果我的文章对你有所帮助,点赞、转发都是一种支持!

Go 面试每天一篇(第 21 天)

Go 面试每天一篇(第 21 天)

Go 面试每天一篇(第 21 天)

 

上一篇:Go 面试每天一篇(第 20 天)


下一篇:Go 面试每日一题(1)