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()) }
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)) }
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!