Maison > développement back-end > Golang > le corps du texte

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
Libérer: 2024-11-19 17:50:03
original
1045 Les gens l'ont consulté

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)
}
Copier après la connexion

Ce code produit le résultat attendu :

{[(addr: 0x8201dde620)] (addr: 0x8201dde620)} [bar] bar
Copier après la connexion

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

{[bar] bar} [bar] bar
Copier après la connexion
Copier après la connexion

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)
}
Copier après la connexion

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

{[bar] bar} [bar] bar
Copier après la connexion
Copier après la connexion

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!

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