特定
var dst, src map[K]V
Run Code Online (Sandbox Code Playgroud)
我可以复制所有项目src到dst做
for k, v := range src {
dst[k] = v
}
Run Code Online (Sandbox Code Playgroud)
有没有比较惯用的方法呢?
copy仅适用于切片(以及string作为源).
我正在尝试将map(amap)的内容复制到另一个()内部aSuperMap然后清除, amap以便它可以在下一个迭代/循环中获取新值.问题是,如果不在超图中清除其引用,则无法清除地图.这是一些伪代码.
for something := range fruits{
aMap := make(map[string]aStruct)
aSuperMap := make(map[string]map[string]aStruct)
for x := range something{
aMap[x] = aData
aSuperMap[y] = aMap
delete(aMap, x)
}
//save aSuperMap
saveASuperMap(something)
}
Run Code Online (Sandbox Code Playgroud)
我也试过一些动态的东西,但很明显它会抛出一个错误(不能分配给nil)
aSuperMap[y][x] = aData
Run Code Online (Sandbox Code Playgroud)
问题是如何创建关联映射?在PHP中,我只使用aSuperMap [y] [x] = aData.似乎golang没有任何明显的方法.如果我delete(aMap, x)从超级地图中删除 它的引用也会被删除.如果我不删除它,supermap最终会出现重复数据.基本上在每个循环中它aMap使用新值加上所有旧值.
这是我的代码:
func test(v map[string]string) {
v["foo"] = "bar"
}
func main() {
v := make(map[string]string)
test(v)
fmt.Printf("%v\n", v) // prints map[foo:bar]
}
Run Code Online (Sandbox Code Playgroud)
我对 Go 还很陌生,但据我所知,由于我将映射值传递给test()而不是指向映射的指针,因此该test()函数应该修改映射的不同变量,因此不会影响中变量的值main()。我本来希望它能打印出来map[]。我测试了不同的场景:
type myStruct struct {
foo int
}
func test2(v myStruct) {
v.foo = 5
}
func main() {
v := myStruct{1}
test2(v)
fmt.Printf("%v\n", v) // prints {1}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,代码的行为符合我的预期。v函数中的变量不受main()中变量的更改的影响test2()。那么为什么地图不同呢?