Home >Backend Development >Golang >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.
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.
append
The function returns a new slice. 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!