登录
首页 >  Golang >  Go问答

容器对象中未正确更新golang切片值

来源:stackoverflow

时间:2024-02-18 17:21:22 314浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《容器对象中未正确更新golang切片值》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

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)
}

我有一个根地图,其中包含“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")

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>