Golang 语言面试题 - 第 2 天 (一起来看下评论区热闹的讨论!!!)

Seek · · 1014 次点击 · 开始浏览    置顶

来看下今天的题目: 下面这段代码输出什么,说明原因。 ```go func main() { slice := []int{0,1,2,3} m := make(map[int]*int) for key,val := range slice { m[key] = &val } for k,v := range m { fmt.Println(k,"->",*v) } } ``` 参考答案: ```go 0 -> 3 1 -> 3 2 -> 3 3 -> 3 ``` 解析:这是新手常会犯的错误写法,for range 循环的时候会**创建每个元素的副本,而不是元素的引用**,所以 m[key] = &val 取的都是变量 val 的地址,所以最后 map 中的所有元素的值都是变量 val 的地址,因为最后 val 被赋值为3,所有输出都是3. 正确的写法: ```go func main() { slice := []int{0,1,2,3} m := make(map[int]*int) for key,val := range slice { value := val m[key] = &value } for k,v := range m { fmt.Println(k,"===>",*v) } } ``` 扩展题目 ```go type Test struct { name string } func (this *Test) Point(){ fmt.Println(this.name) } func main() { ts := []Test{ {"a"}, {"b"}, {"c"}, } for _,t := range ts { //fmt.Println(reflect.TypeOf(t)) defer t.Point() } } ``` <br> 参考: https://blog.csdn.net/idwtwt/article/details/87378419

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

1014 次点击  ∙  1 赞  
加入收藏 微博
13 回复  |  直到 2021-03-08 22:30:55
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传