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

PHPz
Freigeben: 2024-02-08 21:57:30
nach vorne
1090 Leute haben es durchsucht

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)
}
Nach dem Login kopieren

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")
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!