Home  >  Article  >  Backend Development  >  golang update slice value not reflected in container object

golang update slice value not reflected in container object

PHPz
PHPzforward
2024-02-08 21:57:301068browse

golang update slice value not reflected in container object

php editor Baicao will discuss a problem about slice value update in Golang: when we update the value in a slice, why does the value in the container object not get the corresponding response? of updates. This problem is often encountered by developers using Golang, so we will delve into the reasons and provide solutions. Whether you are a beginner or an experienced developer, by reading this article, you will be able to better understand slicing operations in Golang.

Question content

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

I have a root map that contains "disney" -> "world" pairs. In that root map, I added a slice with "mickeymouse" in the function addlist, and then added a map with the "donald"->"duck" pair in the function addmap. However, the slice is not added and the map is added to the root map. Submapping is expected behavior, but slice addition seems to be abnormal behavior. I think a slice is a reference, like a map in golang. How is this going? It should work in java. Where did I go wrong? How can I make it work? In the actual larger problem, I have no other option to return anything except an error in the function.

Solution

  • append The function returns a new slice.
  • Storing values ​​in map does not generate a new map.

So it's natural that you don't see the new tiles, but you do see that the map's contents have been updated.

How can I make it work?

Store new slices instead of old slices, for example

mylist := root["list"]
mylist = append(mylist.([]interface{}),"mickeymouse")
root["list"] = mylist

// or, doing it on one line
root["list"] = append(root["list"].([]any), "mickeymouse")

The above is the detailed content of golang update slice value not reflected in container object. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete