为什么地图值即使不是指针也会改变 - Golang

时间:2014-11-18 14:05:13

标签: testing go

我试图测试方法。它的签名是func (gv *myType) Update(all map[string][]SomeType) error

虽然测试失败(期望值与收到的值不匹配)但我发现它收到的地图(allSub)也已更新"在评估方法之后。这是代码:

t.Logf("allsub %v", allSub)
if err := gv.Update(allSub); err != nil {
    t.Error(err)
    return
}
if !reflect.DeepEqual(egv, gv) {
    t.Errorf("allSub %v", allSub)
    return
}

输出

mth_test.go:265: allsub map[b:[{1 3 3}] a:[{1 0 0} {1 2 0}]]
mth_test.go:271: allSub map[a:[{1 2 0}]]

正如您在t.Logf("allsub %v", allSub)上看到的那样,我们有map[b:[{1 3 3}] a:[{1 0 0} {1 2 0}]],然后在评估if !reflect.DeepEqual(egv, gv)之后,allSub变为allSub map[a:[{1 2 0}]]。这让我发疯,我想知道这怎么可能? allSub不是指针。

1 个答案:

答案 0 :(得分:0)

地图,切片,渠道是参考类型。规范正在进行中以便更清楚,但基本上这些内置类型的实现需要引用底层数据结构。

因此,您可以认为map类型的对象实际上是对关联数组的引用。

Effective Go上有一个小段落: https://golang.org/doc/effective_go.html#maps

我引用:

  

与切片类似,贴图保存对基础数据结构的引用。如果将地图传递给更改地图内容的函数,则更改将在调用者中可见。