golang update slice value not reflected in container object

PHPz
Release: 2024-02-08 21:57:30
forward
1089 people have browsed it

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)
}
Copy after login

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")
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!