繁体   English   中英

golang 更新切片值未反映在容器中 object

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM