猿问

为什么我的地图合并功能会合并所有内容?

我有一个相当简单的 Go 程序,它可以确定某人的日程安排是否有重叠。本质上这就是它的作用:


我们有 3 个事件,比如说杂货店:


            day   0  1  2  3  4  5     

apple sale        [-----------]

banana sale             [--------]

pickle sale                [-------------]

该代码几乎可以工作....但问题是,从逻辑上讲,我将其编程为仅比较两个事件。一次不是三个。然而,结果是这样的:


-------------

| Events    |

-------------


Name: apple sale,

Start:0

End:4


Name: banna sale,

Start:2

End:5


Name: car sale,

Start:3

End:10



-------------

| Overlaps  |

-------------


Events: banna sale, car sale, apple sale,

Start:3

End:4


Events: car sale, apple sale, banna sale,

Start:3

End:5


Events: banna sale, apple sale,

Start:2

End:4

不知何故,我认为该mergeKeys()功能正在做一些奇怪的事情。有任何想法吗?


有只小跳蛙
浏览 114回答 1
1回答

慕尼黑的夜晚无繁华

好的。所以我弄清楚出了什么问题: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} )    }}在我接受这个答案之前,我仍然愿意讨论和更好的解决方案。我希望这可以帮助那里的人!
随时随地看视频慕课网APP

相关分类

Go
我要回答