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

Pourquoi « fmt.Println » n'utilise-t-il pas la méthode « String() » de ma Struct ?

Susan Sarandon
Libérer: 2024-11-22 05:03:15
original
392 Les gens l'ont consulté

Why Doesn't `fmt.Println` Use My Struct's `String()` Method?

Découvrir le mystère : pourquoi fmt.Println ignore les méthodes String() dans Structs

Imaginez un dilemme : vous définissez une méthode String() pour qu'une structure fournisse des comportement d'impression, mais fmt.Println semble l'ignorer, vous laissant avec une sortie illisible. C'est le cas du code suivant :

package main

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

Sortie attendue :

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

Sortie réelle :

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

Démêler les raisons

Il y a deux facteurs clés derrière ce comportement :

  • Non exporté types : Le type de barre n’est pas exporté, ce qui signifie qu’il ne peut être utilisé que dans le même package. Lorsque des types non exportés sont incorporés dans des structures exportées comme foo, leurs méthodes ne sont pas non plus exportées.
  • Champs non exportés : Les champs b et bb dans foo ne sont pas exportés, ce qui signifie que leur méthode String() ne peut pas être accessible par fmt.Println.

Éclairer le Solution

Pour résoudre ce problème, nous devons exporter à la fois le type de barre et les champs foo. Voici le code corrigé :

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

Playground : https://play.golang.org/p/OhoIcB7cA3

Cela garantit que Bar et sa méthode String() sont exportés, permettant fmt.Println pour l'utiliser. Par conséquent, nous obtenons le résultat souhaité :

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

En conclusion, n'oubliez pas d'exporter à la fois les types et les champs impliqués dans la méthode String() pour permettre à fmt.Println de tirer parti de cette puissante fonctionnalité de formatage personnalisé.

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