你好哇,今天是节前最后一天,提前祝大家中秋愉快,假期玩的开心!还有一件事告诉大家,《每天一篇》在放假期间会停更三天!平日里我们必须努力上班、学习成长,放了假就好好休息放松、调整好状态,节后我们再继续奋斗!
来看下昨天题目的解析:
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 细节,你别再掉进坑里!
如果我的文章对你有所帮助,点赞、转发都是一种支持!