Heim >Backend-Entwicklung >Golang >Golang-Aktualisierungs-Slice-Wert wird im Containerobjekt nicht widergespiegelt

Golang-Aktualisierungs-Slice-Wert wird im Containerobjekt nicht widergespiegelt

PHPz
PHPznach vorne
2024-02-08 21:57:301115Durchsuche

Golang-Aktualisierungs-Slice-Wert wird im Containerobjekt nicht widergespiegelt

php-Editor Baicao wird in diesem Artikel ein Problem bei der Aktualisierung von Slice-Werten in Golang besprechen: Wenn wir den Wert in einem Slice aktualisieren, warum wird der Wert im Containerobjekt nicht entsprechend aktualisiert? Entwickler, die Golang verwenden, stoßen häufig auf dieses Problem. Wir werden uns daher mit den Gründen befassen und Lösungen anbieten. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, können Sie durch die Lektüre dieses Artikels die Slicing-Vorgänge in Golang besser verstehen.

Frageninhalt

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

Ich habe eine Stammkarte, die das Paar „Disney“ -> „Welt“ enthält. In dieser Root-Map habe ich ein Slice mit „mickeymouse“ in der Funktion „addlist“ und dann eine Map mit dem Paar „donald“ -> „duck“ in der Funktion „addmap“ hinzugefügt. Das Slice wird jedoch nicht hinzugefügt und die Karte wird zur Stammkarte hinzugefügt. Submapping ist das erwartete Verhalten, aber das Hinzufügen von Slice scheint ein abnormales Verhalten zu sein. Ich denke, ein Slice ist eine Referenz, wie eine Karte in Golang. Wie läuft das? Es sollte in Java funktionieren. Was habe ich falsch gemacht? Wie kann ich dafür sorgen, dass es funktioniert? Bei dem eigentlich größeren Problem habe ich keine andere Möglichkeit, etwas anderes als einen Fehler in der Funktion zurückzugeben.

Lösung

  • append Die Funktion gibt ein neues Slice zurück.
  • Das Speichern von Werten in map generiert keine neue Karte.

Es ist also selbstverständlich, dass Sie die neuen Kacheln nicht sehen, aber Sie sehen, dass der Inhalt der Karte aktualisiert wurde.

Wie kann ich dafür sorgen, dass es funktioniert?

Bewahren Sie die neue Scheibe anstelle der alten auf, z.B.

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

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

Das obige ist der detaillierte Inhalt vonGolang-Aktualisierungs-Slice-Wert wird im Containerobjekt nicht widergespiegelt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen