1. 首页
  2. Go每日一题

Go每日一题(1) 的题目如下

6054 次点击 · 8 赞 · 开始浏览 · 来源「Golang来啦」

下面这段代码输出什么,说明原因。

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)
	}
}

答案解析:

0 -> 3
1 -> 3
2 -> 3
3 -> 3

解析:这是新手常会犯的错误写法,for range 循环的时候会创建每个元素的副本,而不是元素的引用,所以 m[key] = &val 取的都是变量 val 的地址,所以最后 map 中的所有元素的值都是变量 val 的地址,因为最后 val 被赋值为3,所有输出都是3.

正确的写法:

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)
	}
}

扩展题目

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()
	}
	
}

参考:https://blog.csdn.net/idwtwt/article/details/87378419

6054 阅读
56 回复
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册

今日阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)