Heim >Backend-Entwicklung >Golang >Warum unterscheiden sich die „fmt.Printf'-Ausgaben von Go beim Drucken von Zeigern auf Strukturen und Zeigern auf Kartenwerte?

Warum unterscheiden sich die „fmt.Printf'-Ausgaben von Go beim Drucken von Zeigern auf Strukturen und Zeigern auf Kartenwerte?

Linda Hamilton
Linda HamiltonOriginal
2024-12-03 16:54:11575Durchsuche

Why do Go's `fmt.Printf` outputs differ when printing pointers to structs and pointers to map values?

Zeiger in Go: Die Printf-Formatierung verstehen

In Go spielen Zeiger eine entscheidende Rolle bei der Übergabe von Variablen als Referenz. Allerdings kann ihre Verwendung manchmal zu unerwarteten Ergebnissen führen, wie im bereitgestellten Codebeispiel zu sehen ist. Lassen Sie uns in die Details eintauchen und die Unstimmigkeiten beheben.

Das Problem:

Der Code versucht, zwei Variablen auszugeben, eine einen Zeiger auf eine Teststruktur (&test1) und eine der andere ein Wert aus einer Karte (&test2). Das Problem tritt beim Drucken dieser Werte auf, da sie unterschiedliche Ausgaben erzeugen.

Die Erklärung:

Der Schlüssel zum Verständnis der Diskrepanz liegt in der Funktion fmt.Printf. Diese Funktion benötigt einen Formatstring und eine variable Anzahl von Argumenten vom Typ interface{}. Wenn ein Wert übergeben wird, der nicht vom Typ interface{} ist, wird er automatisch in einen interface{}-Wert eingeschlossen.

Im ersten Fall ist &test1 vom Typ *Test, und wenn er an fmt.Printf übergeben wird, es ist in einen interface{}-Wert eingeschlossen. Die Standardformatierung für Zeiger ist %p, wodurch die hexadezimale Adresse des Werts ausgegeben wird. Daher lautet die Ausgabe „0xc00009e190“.

Im Gegensatz dazu ist &test2 vom Typ *interface{}. Bei der Übergabe an fmt.Printf wird es in einen anderen interface{}-Wert eingeschlossen. Die Standardformatierung für interface{}-Werte ist %v und variiert je nach zugrunde liegendem Typ. In diesem Fall ist der zugrunde liegende Typ ein Zeiger auf interface{} und das %v-Format für Zeiger ist %p. Daher ist die Ausgabe ebenfalls eine hexadezimale Adresse, jedoch für die Adresse des *interface{}-Werts, also „0xc00029c0a0“.

Die Lösung:

Zu erhalten Es kann ein Strukturwert aus test2 vom Typ Assertion verwendet werden. Dies setzt im Wesentlichen voraus, dass der in test2 gespeicherte Wert eine Teststruktur ist und wandelt ihn entsprechend um.

test2 := Models["test"].(Test)

Mit dieser Änderung wird test2 vom Typ Test sein und bei der Übergabe an fmt.Printf die erzeugen gleiche Ausgabe wie &test1.

Best Practice:

Es wird generell empfohlen, *Testwerte zu speichern direkt in der Karte, um die Notwendigkeit von Typzusicherungen oder Zwischenvariablendeklarationen zu vermeiden. Dadurch wird sichergestellt, dass die in der Karte gespeicherten Schnittstellenwerte bereits Zeiger auf Test sind, die unverändert verwendet und weitergegeben werden können.

Das obige ist der detaillierte Inhalt vonWarum unterscheiden sich die „fmt.Printf'-Ausgaben von Go beim Drucken von Zeigern auf Strukturen und Zeigern auf Kartenwerte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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