【发布时间】:2018-05-19 04:43:09
【问题描述】:
我的代码循环遍历 Task 的数组并创建一个带有字符串键和 Task 值的 Map:
package main
import (
"fmt"
)
type Task struct {
Name string
Project string
}
func main() {
taskMap := map[string]*Task{}
taskList := []Task{
{
Name: "name1",
Project: "project1",
},
{
Name: "name2",
Project: "project2",
},
{
Name: "name3",
Project: "project3",
},
}
for _, task := range taskList {
taskMap[task.Name] = &task
}
// Print results
for k, v := range taskMap {
fmt.Println(k, v)
}
}
这段代码的输出如下:
name1 &{name3 project3}
name2 &{name3 project3}
name3 &{name3 project3}
这不是我所期望的,因为它每次都打印相同的内容。我对这里发生的事情有一点线索,因为如果我用以下内容替换循环,它会按预期工作:
for _, task := range taskList {
taskMap[task.Name] = &Task{
Name: task.Name,
Project: task.Project,
}
}
因此,不知何故,对上次访问任务的引用最终存储在 taskMap 的每个键中,显然。
有没有办法在不手动复制每个字段的情况下做到这一点?
【问题讨论】:
-
变量
task存储了一个在每次迭代中更改的本地副本,但task的地址(存储在地图中)保持不变。因此,当您打印地图内容时,所有地图值都指向最后一个列表项的副本。