Maison > développement back-end > Golang > 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
Libérer: 2024-11-23 04:06:20
original
493 Les gens l'ont consulté

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 :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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

}

Copier après la connexion

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 :

1

2

3

4

func (t TT) String() string {

    type TT2 TT

    return fmt.Sprintf("%+v", TT2(t))

}

Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal