首先来看下面一段代码是否有问题:
package src
import (
"testing"
)
type A struct {
ele1 int
ele2 string
}
func TestRange(t *testing.T) {
aSlice := make([]A, 5)
for i:=0; i<5; i++ {
aSlice[i] = A{i,"lalalala"}
}
var bSlice []*A
for _, ele := range aSlice {
bSlice = append(bSlice, &ele)
}
}
后面我们发现,bSlice里面的值始终是一个。造成这个的原因,就是range在赋值给ele的时候,使用的是值传递,ele会比初始化一次,然后其地址始终是不变的。
但是这样是可以的:
package src
import (
"testing"
)
type A struct {
ele1 int
ele2 string
}
func TestRange(t *testing.T) {
aSlice := make([]*A, 5)
for i:=0; i<5; i++ {
aSlice[i] = &A{i,"lalalala"}
}
var bSlice []*A
for _, ele := range aSlice {
bSlice = append(bSlice, ele)
}
}
其实这个本质没有区别,rang在赋值给ele的时候也是值传递的,只不过这个时候的值是个指针。