Heim > Backend-Entwicklung > Golang > Warum verhindert die Verwendung eines Zeigerempfängers für die Methode „String()' eine Dead-Loop bei der Go-String-Formatierung?

Warum verhindert die Verwendung eines Zeigerempfängers für die Methode „String()' eine Dead-Loop bei der Go-String-Formatierung?

Linda Hamilton
Freigeben: 2024-11-23 04:06:20
Original
489 Leute haben es durchsucht

Why Does Using a Pointer Receiver for `String()` Method Prevent a Dead Loop in Go String Formatting?

Den Unterschied zwischen „t“ und „*t“ in der Go-String-Formatierung verstehen

In einem Go-Programm können Variablennamen vorangestellt werden mit einem Sternchen (*), um einen Zeigertyp anzugeben. Diese Unterscheidung ist im Zusammenhang mit der Zeichenfolgenformatierung mit dem fmt-Paket von entscheidender Bedeutung.

Frage:

Bedenken Sie den folgenden Code:

package main

import "fmt"

type TT struct {
    a int
    b float32
    c string
}

func (t *TT) String() string {
    return fmt.Sprintf("%+v", *t)
}

func main() {
    tt := &TT{3, 4, "5"}
    fmt.Printf(tt.String())
}
Nach dem Login kopieren

Warum Funktioniert der Code, wenn String einen Zeigerempfänger hat (func (t *TT) String() string), aber eine tote Schleife verursacht, wenn der Empfänger kein Zeiger ist? type (func (t TT) String() string)?

Antwort:

Das fmt-Paket prüft, ob die String()-Methode im Operanden vorhanden ist erhält. Wenn der Empfänger von String ein Zeigertyp ist, enthält der Methodensatz des Basistyps String() nicht, sodass das fmt-Paket ihn nicht aufruft.

Im Gegensatz dazu, wenn der Empfänger ein Nicht-Zeiger ist Typ, String() ist im Methodensatz des Basistyps enthalten. Dies bedeutet, dass das fmt-Paket String() aufruft, was in diesem Fall dieselbe aufgerufene Methode ist, was zu einer Endlosschleife führt.

Vorbeugung:

Zu vermeiden In dieser Endlosschleife sollten Sie erwägen, mit dem Schlüsselwort „type“ einen neuen Typ zu erstellen und die Typkonvertierung auf den zu formatierenden Wert anzuwenden:

func (t TT) String() string {
    type TT2 TT
    return fmt.Sprintf("%+v", TT2(t))
}
Nach dem Login kopieren

Dieser Ansatz verhindert die indirekte Rekursion durch Isolieren der String()-Methode innerhalb des neuen Typs, der durch das Schlüsselwort „type“ erstellt wurde.

Das obige ist der detaillierte Inhalt vonWarum verhindert die Verwendung eines Zeigerempfängers für die Methode „String()' eine Dead-Loop bei der Go-String-Formatierung?. 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