Maison  >  Article  >  développement back-end  >  Pourquoi « fmt.Println » n'utilise-t-il pas la méthode « String() » d'une structure à moins que la structure et la méthode ne soient exportées ?

Pourquoi « fmt.Println » n'utilise-t-il pas la méthode « String() » d'une structure à moins que la structure et la méthode ne soient exportées ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-19 17:50:031044parcourir

Why doesn't `fmt.Println` use a struct's `String()` method unless the struct and method are exported?

Méthodes fmt.Println et String()

Pourquoi fmt.Println n'utilise-t-il pas les méthodes String() des membres lorsqu'il est invoqué sur une structure ? Examinons le mécanisme sous-jacent.

Considérez le code suivant :

import "fmt"

type Bar struct{}

func (b Bar) String() string {
    return "bar"
}

type Foo struct {
    B []*Bar
    BB *Bar
}

func main() {
    f := Foo{B: []*Bar{&Bar{}}, BB: &Bar{}}
    fmt.Println(f, f.B, f.BB)
}

Ce code produit le résultat attendu :

{[(addr: 0x8201dde620)] (addr: 0x8201dde620)} [bar] bar

Cependant, vous vous demandez peut-être pourquoi le résultat n'est pas le suivant :

{[bar] bar} [bar] bar

qui afficherait la représentation String() des membres au lieu de la mémoire adresses.

La raison réside dans la nature non exportée du type Bar et de sa méthode String(). Dans Go, les membres et méthodes non exportés ne sont accessibles que dans le package dans lequel ils sont définis. Puisque fmt.Println ne fait pas partie du même package, il ne peut pas accéder à ces éléments non exportés. Par conséquent, il recourt au comportement par défaut consistant à imprimer les adresses mémoire pour les types non intégrés.

Pour résoudre ce problème, vous devez exporter à la fois le type Bar et sa méthode String(). De plus, les champs de la structure Foo doivent également être exportés pour un encodage et un décodage JSON corrects.

Voici une version modifiée du code qui démontre l'approche correcte :

import "fmt"

type Bar struct{}

func (b Bar) String() string {
    return "bar"
}

type Foo struct {
    B []*Bar
    BB *Bar
}

func main() {
    f := Foo{B: []*Bar{&Bar{}}, BB: &Bar{}}
    fmt.Println(f)
}

Avec ces modifications implémenté, le résultat sera désormais :

{[bar] bar} [bar] bar

Cet exemple souligne l'importance d'utiliser les types et méthodes exportés pour une intégration appropriée avec des formateurs tels que fmt.Println.

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