我试图测试方法。它的签名是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不是指针。
答案 0 :(得分:0)
地图,切片,渠道是参考类型。规范正在进行中以便更清楚,但基本上这些内置类型的实现需要引用底层数据结构。
因此,您可以认为map
类型的对象实际上是对关联数组的引用。
Effective Go上有一个小段落: https://golang.org/doc/effective_go.html#maps
我引用:
与切片类似,贴图保存对基础数据结构的引用。如果将地图传递给更改地图内容的函数,则更改将在调用者中可见。