gpt4 book ai didi

go - slice 中元素的地址为什么相同?以及如何将它们复制到指针?

转载 作者:行者123 更新时间:2023-12-01 22:32:50 25 4
gpt4 key购买 nike

我有一段代码:

    //initialize a slice
arr := make([]int, 0)
arr = append(arr, 1, 2)
for _, k := range arr {
fmt.Printf("%p %+v\n", &k, k)
}

//make a copy, but the element is a pointer
arrP := make([]*int, 0)
for _, k := range arr {
arrP = append(arrP, &k)
}
//why arrP is different with arr?
for _, k := range arrP {
fmt.Printf("%p %+v\n", k, *k)
}


结果是:
0xc000018088 1
0xc000018088 2
0xc000090000 2
0xc000090000 2
我的问题:
为什么地址相同?
为什么arrP [0]的值不为1?

最佳答案

参见Go CommonMistakes: Using reference to loop iterator variable

为什么地址相同?

k的值随着循环的前进而更新。

为什么arrP [0]的值不为1?

与上述相同。

为了用您提供的示例的修改版进行演示:

    arr := make([]int, 0)
arr = append(arr, 1, 2)
for i, _ := range arr {
fmt.Printf("%p %+v\n", &arr[i], arr[i])
}

arrP := make([]*int, 0)
for i, _ := range arr {
arrP = append(arrP, &arr[i])
}

for i, _ := range arrP {
fmt.Printf("%p %+v\n", arrP[i], *arrP[i])
}

结果是:
0xc00009a010  1
0xc00009a018 2
0xc00009a010 1
0xc00009a018 2

关于go - slice 中元素的地址为什么相同?以及如何将它们复制到指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60369383/

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