将结构分配给结构切片内部的结构

Assign struct to struct inside slice of struct

将结构分配给结构内部循环时的奇怪行为。

package main

import (
    "fmt"
)

func main() {
    type A struct {
        a string
    }
    type B struct {
        A
        b string
    }
    var z []B
    
    c := A{a:"Test"}
    d := B{A:c,b:"Test"}
    
    fmt.Println(c)
    fmt.Println(d)
    
    z = append(z, B{b:"Test"})
    z = append(z, B{b:"Test"})
    
    fmt.Println(z)
    
    for _, x := range z {
        x.A = c
    }
    
    fmt.Println(z)
}

输出:

{Test}
{{Test} Test}
[{{} Test} {{} Test}]
[{{} Test} {{} Test}]

期望值:

{Test}
{{Test} Test}
[{{} Test} {{} Test}]
[{{Test} Test} {{Test} Test}]

检查这个Go Playground

原因是,通过迭代 z,您正在复制 z 的元素,标识为 x。换句话说,更新 x 并不意味着您正在更新 z 而是它的元素的副本。您应该按如下方式进行:

for i, _ := range z {
    z[i].A = c
}

我已将其复制到 playground