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

你可能感兴趣的:(Go)