golang面试题

for循环遍历结构体

看了李文周老师的博客,里面提到的一道面试题如下:

type student struct {
	name string
	age  int
}

func main() {
	m := make(map[string]*student)
	stus := []student{
		{name: "小王子", age: 18},
		{name: "娜扎", age: 23},
		{name: "大王八", age: 9000},
	}
	for _, stu := range stus {   
	// 问题在这里,遍历时,临时变量stu只初始化了一次,
	// 它的指针一直没有改变过,第二次遍历时只是在在原来这块内存上重新赋值了。
	// 所以下面的打印结果里面,stu值在改变,但是指针未变。
		m[stu.name] = &stu
		fmt.Println(m)
		fmt.Printf("stu=%v   %p\n", stu, &stu)
	}
	fmt.Println()
	fmt.Println(m)
	// 那么下面打印出来的,就是最后一次赋的值stu
	for k, v := range m {
		fmt.Println(k, "=>", v.name)
	}
}

打印结果如下:

map[小王子:0xc0000040f0]
stu={小王子 18}   0xc0000040f0
map[娜扎:0xc0000040f0 小王子:0xc0000040f0]
stu={娜扎 23}   0xc0000040f0
map[大王八:0xc0000040f0 娜扎:0xc0000040f0 小王子:0xc0000040f0]
stu={大王八 9000}   0xc0000040f0

map[大王八:0xc0000040f0 娜扎:0xc0000040f0 小王子:0xc0000040f0]
小王子 => 大王八
娜扎 => 大王八
大王八 => 大王八

解决这个问题可以在for循环赋值时,将代码修改为:

	for i, stu := range stus { 
		m[stu.name] = &stus[i]
		fmt.Println(m)
		fmt.Printf("stu=%v   %p\n", stu, &stu[i])
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值