Heim > Backend-Entwicklung > Golang > Wie interagieren „fmt.Printf' und Zeigertypen von Go und warum erzeugen sie unterschiedliche Ausgaben für unterschiedliche Zeigertypen?

Wie interagieren „fmt.Printf' und Zeigertypen von Go und warum erzeugen sie unterschiedliche Ausgaben für unterschiedliche Zeigertypen?

Linda Hamilton
Freigeben: 2024-12-09 20:21:18
Original
557 Leute haben es durchsucht

How Do Go's `fmt.Printf` and Pointer Types Interact, and Why Do They Produce Different Outputs for Different Pointer Types?

Unterschiede in Go-Zeigern auswerten

In Go sind Zeiger für die Arbeit mit Variablen unerlässlich. Allerdings kann es schwierig sein, die Nuancen zwischen verschiedenen Zeigertypen zu verstehen. In diesem Artikel wird ein spezifisches Szenario untersucht, das die Unterschiede zwischen Zeigern und deren Auswirkungen auf die Ausgabe bei Verwendung der Standardformatierung im fmt-Paket zeigt.

Der fragliche Code

Der folgende Codeausschnitt demonstriert dies Problem:

type Test struct {
    Test string
}

var Models = map[string]interface{}{
    "test": newTest(),
}

func main() {
    test1 := Test{}
    fmt.Println("Test 1: ")
    fmt.Printf("%v", test1)
    fmt.Println()
    fmt.Println("Test 1 as pointer: ")
    fmt.Printf("%v", &test1)
    fmt.Println()
    test2 := Models["test"]
    fmt.Println("Test 2: ")
    fmt.Printf("%v", test2)
    fmt.Println()
    fmt.Println("Test 2 as pointer: ")
    fmt.Printf("%v", &test2)
}

func newTest() Test {
    var model Test
    return model
}
Nach dem Login kopieren

Das Problem

Beim Ausführen des Codes werden Sie einen Unterschied bemerken Ausgabe beim Drucken von test2 im Vergleich zu test1 als Zeiger. Die Ausgabe für test1 als Zeiger ist eine leere Zeichenfolge, während die Ausgabe für test2 als Zeiger eine hexadezimale Darstellung der Adresse ist.

Erklärung

Die Funktion fmt.Printf verwendet %v Verb für die Standardformatierung, das ein bestimmtes Format basierend auf dem Typ des gedruckten Werts auswählt. Für Zeiger ist das Standardformat die hexadezimale Darstellung der Adresse.

Im ersten Fall (test1 als Zeiger) ist der gedruckte Wert ein Zeiger auf eine Teststruktur. Da die Struktur jedoch mit Nullwerten initialisiert wurde, ist die Ausgabe leer.

Im zweiten Fall (test2 als Zeiger) ist der gedruckte Wert ein Zeiger auf eine Schnittstelle{}. Bevor der Wert das %v-Verb erreichte, durchlief er eine zusätzliche Umhüllung innerhalb einer anderen Schnittstelle {}, die dann auf Models["test"] verweist. Da es sich bei dem letztlich ausgegebenen Wert um einen Zeiger auf eine Schnittstelle{} handelt, gilt die Standardformatierung für Zeiger und Sie erhalten die hexadezimale Darstellung der Adresse.

Lösung

Um dieses Problem zu beheben, Man muss die Typzusicherung verwenden, um die eigentliche Teststruktur aus test2 zu extrahieren. Dies kann erreicht werden durch:

t2 := Models["test"]
test2 := t2.(Test) // test2 is now of type Test
Nach dem Login kopieren

Mit der Typzusicherung zeigt die Variable test2 nun auf die Teststruktur, und Sie können sie wie test1 ausdrucken.

Alternativ kann man mit arbeiten Zeiger auf Test direkt durch Speichern von *Testwerten in der Karte:

var Models = map[string]*Test{
    "test": newTest(),
}
Nach dem Login kopieren

Dieser Ansatz eliminiert die Notwendigkeit einer Typzusicherung und des Umschließens in der Schnittstelle{}, Dadurch wird die hexadezimale Darstellung der Adresse vermieden.

Das obige ist der detaillierte Inhalt vonWie interagieren „fmt.Printf' und Zeigertypen von Go und warum erzeugen sie unterschiedliche Ausgaben für unterschiedliche Zeigertypen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage