go语言关于range的面试题

本文解析了Go语言中range关键字在遍历切片和映射map时的常见误区,重点讲解了为何使用range时会导致所有元素指向同一值。正确的方法是复制每个值再进行存储。通过实例演示了如何避免这种问题并得到了预期结果。

range是go语言中常用的循环关键字 约等于java中的foreach

package main

import "fmt"

func main() {

	slice := []int{0, 1, 2, 3}
	m := make(map[int]*int)
	//这里使用range遍历
	for key, val := range slice {
		m[key] = &v
	}

	for k, v := range m {
		fmt.Println(k, "->", v)
	}
}

猜猜最后打印的结果是什么?

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

为什么都是3?

因为for range 循环的时候会创建一个变量 val , 然后将数组中每一个变量的值依次赋值到这个val上,我们在range里将val的指针放到map里,每次都放得是同一个指针,所以最后打印出来的是最后一次赋到上面的值,也就是3
所以 m[key] = &val 取的都是变量 val 的地址

正确的写法是

func main() {

	slice := []int{0, 1, 2, 3}
	m := make(map[int]*int)

	for key, val := range slice {
		v := val
		m[key] = &v
	}

	for k, v := range m {
		fmt.Println(k, "->", *v)
	}
}


//结果 
/**
3 -> 3
0 -> 0
1 -> 1
2 -> 2
*/
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值