gpt4 book ai didi

for-loop - 在 Go 中复制循环变量的地址

转载 作者:IT王子 更新时间:2023-10-29 01:54:20 25 4
gpt4 key购买 nike

在下面的代码示例中,结果不是我所期望的:

package main

import "fmt"

func main() {
src := map[int]int{1: 1, 2: 2, 3: 3}
fmt.Println("src ", src)

dst := make([]*int, 0, len(src))
for k, _ := range src {
dst = append(dst, &k)
}
for _, a := range dst {
fmt.Print(*a, " ")
}
fmt.Println()
}

结果:

src map[1:1 2:2 3:3]
3 3 3

去 Playground :https://play.golang.org/p/BSDsd3nojz

但我明白发生了什么。 k 不变的地址被添加到 dst,所以当我遍历 dst 时,每个位置都有相同的值: 3

k 的地址在循环中永远不会改变,因此第二个循环继续引用该位置,包含它的最后一个值,3

如何获取要复制的k当前值的地址?我需要这样的东西吗:

for k, _ := range src {
key = new(int)
*key = k
dst = append(dst, key)
}

这看起来很尴尬。

最佳答案

如果你有一个 map[T]X 并且你想得到一个 []*T,你就在正确的轨道上复制循环变量并获得一个地址。

有一种比您的方法更简洁的方法:

for k := range src {
key := k
dst = append(dst, &key)
}

您要添加到 dst 的不是映射中键或值的地址,而是键的副本 的地址。这种区别对您来说可能重要,也可能不重要。

使用循环变量的地址不起作用的原因是循环变量是在每次迭代时更新的单个位置。每次将值类型(如 int 和结构)分配给新变量时都会进行复制。

关于for-loop - 在 Go 中复制循环变量的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45967305/

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