php小编百草在本文中将讨论一个关于Golang中切片值更新的问题:当我们更新一个切片中的值时,为什么容器对象中的值没有得到相应的更新。这个问题在使用Golang的开发者中经常遇到,因此我们将深入探讨其中的原因,并提供解决办法。无论你是初学者还是有经验的开发者,通过阅读本文,你将能够更好地理解Golang中的切片操作。
问题内容
package mainimport ( "fmt")func main() { root := map[string]interface{} { "disney": "world", } fmt.Printf("main begin %v", root) addList(root) fmt.Printf("main after addList %v", root) addMap(root) fmt.Printf("main after addMap %v", 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", mylist) fmt.Printf("addList %v", 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", mymap) fmt.Printf("addMap %v", root)}
登录后复制
我有一个根地图,其中包含“disney”->“world”对。在该根映射中,我在函数 addlist 中添加了一个具有“mickeymouse”的切片,然后在函数 addmap 中添加了一个带有“donald”->“duck”对的映射。但是,切片不会被添加,而映射会被添加到根映射中。子映射是预期行为,但切片添加似乎是异常行为。我认为切片是一个参考,就像 golang 中的地图一样。这是怎么回事?它在 java 中应该可以工作。我哪里出错了?我怎样才能让它发挥作用?在实际的更大问题中,除了函数中的错误之外,我没有其他选择返回任何内容。
解决方法
append 函数返回一个新切片。在 map 中存储值不会生成新地图。
因此,您看不到新切片是很自然的,但您确实会看到地图的内容已更新。
我怎样才能让它发挥作用?
立即学习“go语言免费学习笔记(深入)”;
存储新切片代替旧切片,例如
mylist := root["list"]mylist = append(mylist.([]interface{}),"mickeymouse")root["list"] = mylist// or, doing it on one lineroot["list"] = append(root["list"].([]any), "mickeymouse")
登录后复制
以上就是golang更新切片值没有反映在容器对象中的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2358948.html