php小編百草在本文中將討論一個關於Golang中切片值更新的問題:當我們更新一個切片中的值時,為什麼容器物件中的值沒有得到相應的更新。這個問題在使用Golang的開發者中經常遇到,因此我們將深入探討其中的原因,並提供解決方案。無論你是初學者還是有經驗的開發者,透過閱讀本文,你將能夠更好地理解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) }
我有一個根地圖,其中包含“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")
以上是golang更新切片值沒有反映在容器物件中的詳細內容。更多資訊請關注PHP中文網其他相關文章!