首頁  >  文章  >  後端開發  >  golang更新切片值沒有反映在容器物件中

golang更新切片值沒有反映在容器物件中

PHPz
PHPz轉載
2024-02-08 21:57:301068瀏覽

golang更新切片值沒有反映在容器物件中

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除