将结构分配给结构切片内部的结构
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。
将结构分配给结构内部循环时的奇怪行为。
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。