Go 采坑指南(一) for range 遍历 值引用

func Test_aaas(t *testing.T){
	tesr1 := make(chan *xxa,10)
	xx :=make(map[int]xxa,0)
	b :=xxa{caomao:"XXb"}
	c :=xxa{caomao:"XXc"}
	d :=xxa{caomao:"XXd"}
	e :=xxa{caomao:"XXe"}

	xx[1] =b
	xx[2] =c
	xx[3] =d
	xx[4] =e
	for _,v := range xx{
		fmt.Println("v的值:",v)
		tesr1 <- &v
		fmt.Println(tesr1)
	}

	for m := range tesr1{
		fmt.Println(m)
	}
}

以上代码 我原本以为会是这样的输出。。。

=== RUN   Test_aaas
v的值: {XXb}
v的值: {XXc}
v的值: {XXd}
v的值: {XXe}
&{XXb}
&{XXc}
&{XXd}
&{XXe}

但实际输出是这样的

=== RUN   Test_aaas
v的值: {XXb}
v的值: {XXc}
v的值: {XXd}
v的值: {XXe}
&{XXe}
&{XXe}
&{XXe}
&{XXe}

很容易看出来 通过range 遍历出来的值 其实是值引用, 如果要取到这个真实值的引用还需要 原本 range的对象

func Test_aaas(t *testing.T){
	tesr1 := make(chan *xxa,10)
	xx :=make(map[int]xxa,0)
	b :=xxa{caomao:"XXb"}
	c :=xxa{caomao:"XXc"}
	d :=xxa{caomao:"XXd"}
	e :=xxa{caomao:"XXe"}

	xx[1] =b
	xx[2] =c
	xx[3] =d
	xx[4] =e
	for i,v := range xx{
		fmt.Println("v的值:",v)
		tmp := xx[i] //看这里 不能直接去 v的引用 v是一个固定指针 
		tesr1 <- &tmp
	}

	for m := range tesr1{
		fmt.Println(m)
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值