1 回答
TA贡献1864条经验 获得超6个赞
好的。所以我弄清楚出了什么问题:
go中的地图是通过引用传递的……有点。并不真地。
即使地图前面没有指针……它们是通过引用传递的……有点。确实不是,但您可以在这篇文章“go 中没有按引用传递”和这篇文章“如果映射不是引用变量是什么”中了解更多相关信息。我将为您提供这段摘录以澄清正在发生的事情:
映射值是指向 runtime.hmap 结构的指针。
即使地图不是通过引用而是通过值传递的……您传递给函数的原始地图变量也会被修改。这意味着当我在 mergeKeys 函数中更改左侧地图时,我实际上也在更改 compareEvent.groups 地图。
为了解决这个问题,我创建了一个垃圾地图,我可以对其进行变异并且不会产生任何后果:
if overlaping {
trashMap := make(map[string]bool)
for key, value := range comparisonEvent.groups {
trashMap[key] = value
}
groups := mergeKeys(trashMap, eventItem.groups)
switch overlapCase {
case 1:
overlaps = append( overlaps, event{eventItem.start, eventItem.end, groups} )
case 2:
overlaps = append( overlaps, event{comparisonEvent.start, comparisonEvent.end, groups} )
case 3:
overlaps = append( overlaps, event{eventItem.start, comparisonEvent.end, groups} )
case 4:
overlaps = append( overlaps, event{comparisonEvent.start, eventItem.end, groups} )
}
}
在我接受这个答案之前,我仍然愿意讨论和更好的解决方案。我希望这可以帮助那里的人!
- 1 回答
- 0 关注
- 113 浏览
添加回答
举报