对于这两个结构体
type A struct {
Number *int
}
type B struct {
Number int
}
Run Code Online (Sandbox Code Playgroud)
如果我想循环 B 的切片并将 B.Number 的值分配给新的 A.Number
func main() {
aSlice := []A{}
bSlice := []B{B{1}, B{2}, B{3}}
for _, v := range bSlice {
a := A{}
a.Number = &v.Number
aSlice = append(aSlice, a)
}
}
Run Code Online (Sandbox Code Playgroud)
我会发现所有aSlice a.Number都是相同的值和相同的指针。
for _, v := range aSlice {
fmt.Printf("aSlice Value %v Pointer %v\n", *v.Number,v.Number)
}
Run Code Online (Sandbox Code Playgroud)
将打印
aSlice Value 3 Pointer 0x10414020
aSlice Value 3
Pointer 0x10414020 aSlice Value 3 Pointer 0x10414020
那么 range 是否只更新 for 循环中_,v的值而不改变指针?
完整代码: https: //play.golang.org/p/2wopH9HOjwj
小智 8
发生这种情况是因为变量v
是在循环开始时创建的并且不会更改。因此, 中的每个元素aSlice
都有一个指向同一变量的指针。你应该这样写:
for _, v := range bSlice {
a := A{}
v := v
a.Number = &v.Number
aSlice = append(aSlice, a)
}
Run Code Online (Sandbox Code Playgroud)
在这里,您可以在每次迭代时使用自己的指针创建新变量。
归档时间: |
|
查看次数: |
698 次 |
最近记录: |