gpt4 book ai didi

go - 在 golang range 复制所有项目后指向 src slice 的最后一项

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

在我将一个 slice (src) 中的所有项目复制到一个新 slice (dst) 之后,dst 中的所有项目都指向 src 的最后一个项目。

package main

import (
"fmt"
)

func main() {
src := []string{"a", "b", "c"}
dst := []*string{}
for _, val := range src {
dst = append(dst, &val)
}

for i, s := range dst {
fmt.Printf("%v - %v\n", i, *s)
}
}

>>> 0 - c
>>> 1 - c
>>> 2 - c

为什么不将“a”和“b”复制到 dst slice 中?

最佳答案

解决方案很简单,但与您对 range 语句的预期相反。

变量 val 仅实例化一次,并在每次迭代中保存 src[i]。它没有指向 src[i] 的实际指针。相反,src[i] 的值被复制到分配给 val 的内存中。通过获取 val 的指针,您可以得到它,而不是指向 src[i] 的指针。

package main

import (
"fmt"
)

func main() {
src := []string{"a", "b", "c"}
dst := []*string{}
for _, val := range src {
dst = append(dst, &val)
}

for i, s := range dst {
fmt.Printf("%v - %v - %p\n", i, *s, s)
}

//modify only contents of first index
*dst[0] = "hi val"

for i, s := range dst {
fmt.Printf("%v - %v - %p\n", i, *s, s)
}
}

>>>>
0 - c - 0x1040a120
1 - c - 0x1040a120
2 - c - 0x1040a120
0 - hi val - 0x1040a120
1 - hi val - 0x1040a120
2 - hi val - 0x1040a120

虽然事后看来这是显而易见的 - for _, val -> := <- range src - 如果你没有意识到,它可能会咬你的屁股它,所以这个警告。

附言。这也适用于作为 map 的 src

关于go - 在 golang range 复制所有项目后指向 src slice 的最后一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36916088/

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