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 ?

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 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-23 04:06:20424parcourir

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

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn