卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34370本站已运行393

golang更新切片值没有反映在容器对象中

golang更新切片值没有反映在容器对象中

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

卓越飞翔博客
上一篇: Go 泛型:无效的复合文字
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏