Maison > Article > développement back-end > Pourquoi l'utilisation d'un récepteur de pointeur pour la méthode `String()` empêche-t-elle une boucle morte dans le formatage de la chaîne Go ?
Comprendre la différence entre "t" et "*t" dans le formatage de chaîne Go
Dans un programme Go, les noms de variables peuvent être préfixés avec un astérisque (*) pour indiquer un type de pointeur. Cette distinction est cruciale dans le cadre du formatage de chaîne à l'aide du package fmt.
Question :
Considérez le code suivant :
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()) }
Pourquoi le code fonctionne-t-il lorsque String a un récepteur de pointeur (chaîne func (t *TT) String()), mais provoque une boucle morte lorsque le récepteur est de type non-pointeur (func (t TT) String() string) ?
Réponse :
Le package fmt vérifie l'existence de la méthode String() dans l'opérande qu'il reçoit . Lorsque le récepteur de String est un type pointeur, l'ensemble de méthodes du type de base n'inclut pas String(), donc le package fmt ne l'appelle pas.
En revanche, lorsque le récepteur est un non-pointeur type, String() est inclus dans l’ensemble de méthodes du type de base. Cela signifie que le package fmt appelle String(), qui dans ce cas, est la même méthode invoquée, conduisant à une boucle infinie.
Prévention :
Pour éviter cette boucle sans fin, pensez à créer un nouveau type à l'aide du mot-clé type et à appliquer la conversion de type à la valeur en cours de formatage :
func (t TT) String() string { type TT2 TT return fmt.Sprintf("%+v", TT2(t)) }
Cette approche empêche la récursion indirecte en isolant la méthode String() dans le nouveau type créé par le mot-clé type.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!