go语言关于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
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值