gpt4 book ai didi

go - 将数组复制到 map 会导致 map 中的相同项目

转载 作者:行者123 更新时间:2023-12-01 22:33:28 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to explain golang slice range's phenomenon [duplicate]

(1 个回答)


1年前关闭。




我正在做这种数组复制来映射

package main

import (
"fmt"
)

type Test struct {
Id int
Name string
}

func main() {
tlist := []Test{
Test{1, "mike"},
Test{2, "clara"},
Test{3, "stefan"},
}

tmap := make(map[int]*Test)

// copy to map here
for _, t := range tlist {
tmap[t.Id] = &t
fmt.Printf("list to map %v\n", tmap[t.Id])
}

// debug
for _, t := range tmap {
t.Name = t.Name + "A"
fmt.Printf("%v\n", t)
}

for _, t := range tlist {
fmt.Printf("list after %v\n", t)
}
}
结果输出是 map 只包含所有 map 项中的最后一个数组项。
list to map &{1 mike}
list to map &{2 clara}
list to map &{3 stefan}
&{3 stefanA}
&{3 stefanAA}
&{3 stefanAAA}
list after {1 mike}
list after {2 clara}
list after {3 stefan}
为什么在第一个循环中正确打印每个 map 元素后打印 map 时 map 只包含最后一个数组的项目?

最佳答案

这是因为您在第一个循环中获取了 t 变量的地址。所以 map 中的所有 3 个值都是指向 t 变量的指针,并且 t 变量在循环完成后存储 tlist 的最后一个元素。您应该保存指针而不是循环变量 t 而是直接 slice 元素:

for i, t := range tlist {
tmap[t.Id] = &tlist[i]
fmt.Printf("list to map %v\n", tmap[t.Id])
}

关于go - 将数组复制到 map 会导致 map 中的相同项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63759243/

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