gpt4 book ai didi

Golang 结构从输入中获取不同的值

转载 作者:IT王子 更新时间:2023-10-29 02:29:19 26 4
gpt4 key购买 nike

我在以下代码中看到奇怪的行为:

type A struct {
D []int8
}

func main() {
a := A{D: make([]int8, 0)}
a.D = append(a.D, 0)

b := a
c := a
b.D = append(b.D, 1)
c.D = append(c.D, 2)
fmt.Println(a.D, b.D, c.D)
}

我期望输出是

[0] [0 1] [0 2]

虽然我得到了

[0] [0 2] [0 2]

有人知道为什么...吗?

附注如果我注释掉行“a.D = append(a.D, 0)”,或将 D 的类型从“[]int8”更改为“[]int”,我得到了我期望的结果。奇怪...

最佳答案

首先,更改类型并不能解决问题:https://play.golang.org/p/fHX3JAtfNz

这里发生的事情与追加和引用类型的机制有关。

基本上,所有三个结构都指向同一个底层数组,但每个 slice 都有自己独特的长度参数。

所以当你将 1 附加到 b 时,它是 [0 1],长度为 2。c 仍然是 [0],长度为 1。然后你将 2 附加到 c,使其成为 [0 2],具有 a长度为 2。不经意间,您还更改了 b 中数组的第二个值。如果您可以在不附加的情况下更改 a 的长度,它也将是 [0 2]。

有道理吗?指针和 slice 很奇怪。全文在这里:https://blog.golang.org/slices

关于Golang 结构从输入中获取不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43925874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com