php小编百草在本文中将讨论一个关于Golang中切片值更新的问题:当我们更新一个切片中的值时,为什么容器对象中的值没有得到相应的更新。这个问题在使用Golang的开发者中经常遇到,因此我们将深入探讨其中的原因,并提供解决办法。无论你是初学者还是有经验的开发者,通过阅读本文,你将能够更好地理解Golang中的切片操作。
问题内容
package main
import (
"fmt"
)
func main() {
root := map[string]interface{} {
"disney": "world",
}
fmt.Printf("main begin %vn", root)
addList(root)
fmt.Printf("main after addList %vn", root)
addMap(root)
fmt.Printf("main after addMap %vn", root)
}
func addList(root map[string]interface{}) {
root["list"] = make([]interface{},0,3)
mylist := root["list"]
mylist = append(mylist.([]interface{}),"mickeymouse")
fmt.Printf("addList %vn", mylist)
fmt.Printf("addList %vn", 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 %vn", mymap)
fmt.Printf("addMap %vn", root)
}
我有一个根地图,其中包含“disney”->“world”对。在该根映射中,我在函数 addlist 中添加了一个具有“mickeymouse”的切片,然后在函数 addmap 中添加了一个带有“donald”->“duck”对的映射。但是,切片不会被添加,而映射会被添加到根映射中。子映射是预期行为,但切片添加似乎是异常行为。我认为切片是一个参考,就像 golang 中的地图一样。这是怎么回事?它在 java 中应该可以工作。我哪里出错了?我怎样才能让它发挥作用?在实际的更大问题中,除了函数中的错误之外,我没有其他选择返回任何内容。
解决方法
append
函数返回一个新切片。- 在
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")