从范围生成的值具有相同的指针值

Ali*_*our 4 go

对于这两个结构体

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)

在这里,您可以在每次迭代时使用自己的指针创建新变量。