[英]golang updating slice value is not reflected in container object
package main
import (
"fmt"
)
func main() {
root := map[string]interface{} {
"disney": "world",
}
fmt.Printf("main begin %v\n", root)
addList(root)
fmt.Printf("main after addList %v\n", root)
addMap(root)
fmt.Printf("main after addMap %v\n", root)
}
func addList(root map[string]interface{}) {
root["list"] = make([]interface{},0,3)
mylist := root["list"]
mylist = append(mylist.([]interface{}),"mickeymouse")
fmt.Printf("addList %v\n", mylist)
fmt.Printf("addList %v\n", root)
}
func addMap(root map[string]interface{}) {
root["map"] = make(map[string]interface{})
mymap := root["map"]
mymap.(map[string]interface{})["donald"] = "duck"
fmt.Printf("addMap %v\n", mymap)
fmt.Printf("addMap %v\n", root)
}
我有一个根 map 有一对“迪士尼”->“世界”。 对于那个根 map,我在 function addList 中添加了一个具有“mickeymouse”的切片,然后在 function addMap 中添加了一个带有对“donald”->“duck”的 map。 然而,切片没有被添加,而 map 被添加到根 map。子 map 是预期的行为,但切片添加似乎是异常的。 我认为切片是一个参考,就像 golang 中的 map 一样。 在这种情况下发生了什么? 它会在 Java 中工作。我哪里出错了? 我怎样才能让它发挥作用? 在实际更大的问题中,除了函数错误之外,我没有返回任何东西的选项。
append
function 返回一个新的切片。map
中存储值不会产生新的 map。因此,您看不到新切片是很自然的,但您会看到地图的内容已更新。
我怎样才能让它发挥作用?
将新切片存储在旧切片的位置,例如
mylist := root["list"]
mylist = append(mylist.([]interface{}),"mickeymouse")
root["list"] = mylist
// or, doing it on one line
root["list"] = append(root["list"].([]any), "mickeymouse")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.