本文共 1334 字,大约阅读时间需要 4 分钟。
点击上方蓝色“Golang来啦”关注我哟
加个“星标”,天天 15 分钟,一起学 Go
1.下面代码输出什么?
1func test() []func() { 2 var funs []func() 3 for i := 0; i < 2; i++ { 4 funs = append(funs, func() { 5 println(&i, i) 6 }) 7 } 8 return funs 9}1011func main() {12 funs := test()13 for _, f := range funs {14 f()15 }16}
参考答案及解析:
10xc000018058 220xc000018058 2
知识点:闭包延迟求值。for 循环局部变量 i,匿名函数每一次使用的都是同一个变量。(说明:i 的地址,输出可能与上面的不一样)。
如果想要匿名函数每一次输出不同,应该怎么修改代码?
2.下面的代码能编译通过吗?可以的话输出什么,请说明?
1var f = func(i int) { 2 print("x") 3} 4 5func main() { 6 f := func(i int) { 7 print(i) 8 if i > 0 { 9 f(i - 1)10 }11 }12 f(10)13}
参考答案及解析:10x。这道题一眼看上去会输出 109876543210,其实这是错误的答案,这里不是递归。假设 main() 函数里为 f2(),外面的为 f1(),当声明 f2() 时,调用的是已经完成声明的 f1()。
看下面这段代码你应该会更容易理解一点:
1var x = 2323func main() {4 x := 2*x - 45 println(x) // 输出:426}
解析若有不妥之处,欢迎在留言区交流、指正!
看下今天的题目:
1.下面代码有什么问题,请说明?
1func main() { 2 runtime.GOMAXPROCS(1) 3 4 go func() { 5 for i:=0;i<10 ;i++ { 6 fmt.Println(i) 7 } 8 }() 910 for {}11}
引自《Go语言高级编程》
2.假设 x 已声明,y 未声明,下面 4 行代码哪些是正确的。错误的请说明原因?
1x, _ := f() // 12x, _ = f() // 23x, y := f() // 34x, y = f() // 4
答案以及解析会在下一篇文章中给出,鼓励大家在留言区留下答案,抱团学习,日拱一卒,每天进步一点!
ps:看完文章如果有收获,顺手花 1s 时间帮点下文末右下方的「在看」,感激!
所有学习上的成功,都只依靠两件事 -- 策略和坚持,而坚持本身就是最重要的策略!
推荐阅读:
转载地址:http://vzfnb.baihongyu.com/