Maison > développement back-end > Golang > Pourquoi fmt.Println n'utilise-t-il pas les méthodes Member String() d'une Struct dans Go ?

Pourquoi fmt.Println n'utilise-t-il pas les méthodes Member String() d'une Struct dans Go ?

Mary-Kate Olsen
Libérer: 2024-11-23 07:47:27
original
964 Les gens l'ont consulté

Why Doesn't fmt.Println Use a Struct's Member String() Methods in Go?

Comprendre le comportement de fmt.Println avec les membres de la structure

Dans Go, lorsque nous appelons fmt.Println sur une structure, nous nous attendons à ce qu'elle génère la représentation sous forme de chaîne des membres de la structure en utilisant leurs méthodes String() respectives. Cependant, ce n'est pas toujours le cas.

Considérons le 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

Dans ce code, nous définissons un type bar avec une méthode String() qui renvoie la chaîne "bar ". Nous définissons également un type foo avec les champs b et bb, qui sont respectivement des tranches et des pointeurs vers des types de barres.

Lorsque nous appelons fmt.Println sur f, f.b et f.bb, nous obtenons le résultat suivant :

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

C'est différent de ce à quoi on pourrait s'attendre, ce qui est :

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

Raisons derrière le comportement de fmt.Println

Il y a plusieurs raisons pour lesquelles fmt.Println n'utilise pas la méthode String() des membres lorsqu'il est appelé sur une struct :

  • La méthode String() n'est pas exported : La méthode String() dans le type bar n'est pas exportée car elle commence par une lettre minuscule. Les types et méthodes exportés sont accessibles à partir d'autres packages, contrairement à ceux non exportés.
  • Les champs ne sont pas exportés : Les champs b et bb du type foo ne sont pas non plus exportés car ils commencent par des lettres minuscules. . Par conséquent, ils ne sont pas accessibles à partir d'autres packages et ne sont pas imprimés par fmt.Println.

Solution

Pour résoudre ce problème, nous devons nous assurer que la méthode String() et les champs de la structure sont exportés. Voici le code corrigé :

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

Maintenant, lorsque nous exécutons le code, nous obtenons le résultat attendu :

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

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