Maison  >  Article  >  développement back-end  >  Pourquoi « fmt.Println » n'utilise-t-il pas la méthode « String() » de ma Struct ?

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

Susan Sarandon
Susan Sarandonoriginal
2024-11-22 05:03:15391parcourir

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

Sortie attendue :

{bar bar} [bar] bar

Sortie réelle :

{[0x176f44] 0x176f44} [bar] bar

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

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

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!

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