gpt4 book ai didi

testing - 为什么映射值即使不是指针也会改变 - Golang

转载 作者:数据小太阳 更新时间:2023-10-29 03:28:56 26 4
gpt4 key购买 nike

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

虽然测试失败(期望值与接收到的值不匹配),但我发现它接收到的 map (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 不是指针。

最佳答案

Map、slice、channels都是引用类型。规范正在制定中以使其更加清晰,但基本上这些内置类型的实现需要对底层数据结构的引用。

所以你可以认为 map 类型的对象实际上是对关联数组的引用。

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

我引用:

Like slices, maps hold references to an underlying data structure. If you pass a map to a function that changes the contents of the map, the changes will be visible in the caller.

关于testing - 为什么映射值即使不是指针也会改变 - Golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26996232/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com