Missverständnis des Golang-Schnittstellentyps{}
Bei der Verwendung des Schnittstellentyps {} als Funktionsparameter stoßen Entwickler häufig auf unerwartetes Verhalten, insbesondere wenn Interaktion mit JSON-Daten über json.Unmarshal.
Die Problem:
In Go ist interface{} ein Typ, der jeden Wert und Typ enthalten kann. Es wird jedoch häufig als typloser Container missverstanden. Dieses Missverständnis tritt in folgenden Situationen auf:
func test(i interface{}) { j := []byte(`{ "foo": "bar" }`) json.Unmarshal(j, &i) fmt.Println(i) } func main() { test(Test{}) }
Erwartetes Verhalten:
Dieser Code versucht, JSON-Daten in eine Teststruktur zu entpacken. Dies führt jedoch zu einer unerwarteten Konvertierung der Struktur in einen Typ „map[string]interface{}.“ Nicht-Zeigerwert. Da es sich bei i um eine Schnittstelle{} handelt, die eine Teststruktur enthält, wird sie als Adresse (&i) übergeben, um Änderungen zu ermöglichen. Allerdings betrachtet json.Unmarshal den interface{}-Zeiger als Zeiger auf einen interface{}-Wert, der die Teststruktur enthält. Das Unmarshaling in einen Nicht-Zeiger ist nicht möglich, es wird standardmäßig ein neuer Map[string]interface{}-Wert für das unmarshaled JSON erstellt.
Der richtige Ansatz:
Um dieses Missverständnis aufzuklären, beachten Sie Folgendes Szenario:
Erklärung:
func test(i *interface{}) { j := []byte(`{ "foo": "bar" }`) json.Unmarshal(j, i) fmt.Println(*i) } func main() { var i *Test test(&i) }
Dereferenzieren Sie innerhalb der Funktion den interface{}-Zeiger und übergeben Sie ihn direkt an json.Unmarshal.
Da i einen Zeiger auf die Teststruktur enthält, unmarshaliert json.Unmarshal die JSON-Daten korrekt in die Struktur.Das obige ist der detaillierte Inhalt vonWie kann ich unerwartetes Verhalten vermeiden, wenn ich Gos „interface{}' mit „json.Unmarshal' verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!