为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
有只小跳蛙 2022-05-18 17:05:24
我有一个相当简单的 Go 程序,它可以确定某人的日程安排是否有重叠。本质上这就是它的作用:我们有 3 个事件,比如说杂货店:            day   0  1  2  3  4  5     apple sale        [-----------]banana sale             [--------]pickle sale                [-------------]该代码几乎可以工作....但问题是,从逻辑上讲,我将其编程为仅比较两个事件。一次不是三个。然而,结果是这样的:-------------| Events    |-------------Name: apple sale,Start:0End:4Name: banna sale,Start:2End:5Name: car sale,Start:3End:10-------------| Overlaps  |-------------Events: banna sale, car sale, apple sale,Start:3End:4Events: car sale, apple sale, banna sale,Start:3End:5Events: banna sale, apple sale,Start:2End:4不知何故,我认为该mergeKeys()功能正在做一些奇怪的事情。有任何想法吗?
查看完整描述

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} )

    }

}

在我接受这个答案之前,我仍然愿意讨论和更好的解决方案。我希望这可以帮助那里的人!


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信