Maison > développement back-end > Golang > Pourquoi « fmt.Println » n'appelle-t-il pas les méthodes « String() » sur les membres de la structure dans Go ?

Pourquoi « fmt.Println » n'appelle-t-il pas les méthodes « String() » sur les membres de la structure dans Go ?

DDD
Libérer: 2024-11-27 06:13:10
original
231 Les gens l'ont consulté

Why Doesn't `fmt.Println` Call `String()` Methods on Struct Members in Go?

Dévoilement du fonctionnement interne : pourquoi fmt.Println contourne les méthodes String() pour les structures

Une observation intrigante a fait surface concernant la fonctionnalité de fmt.Println lorsqu'il est appelé à un objet struct. Bien que l'on puisse s'attendre à ce que la méthode String() soit invoquée pour chaque membre, ce n'est pas le cas. L'examen de cet écart mettra en lumière les raisons sous-jacentes de ce comportement.

La cause profonde

Pour comprendre pourquoi fmt.Println ignore les méthodes String() pour les membres de la structure, il est essentiel de considérer deux facteurs cruciaux :

  1. Statut d'exportation :Le La méthode String() définie pour le type bar n’est pas exportée, commençant par une lettre minuscule. Cela empêche d'autres packages ou modules de code d'y accéder, le rendant indisponible pour fmt.Println.
  2. Champs non exportés : Les champs de la structure foo (b et bb) ne sont également pas exportés, ce qui rend les invisibles au code externe. Par conséquent, fmt.Println ne peut pas accéder directement à ces champs pour appeler leurs méthodes String().

Un chemin vers la résolution

Pour rectifier ce problème et permettre à fmt.Println d'utiliser les méthodes String() pour les membres de la structure, plusieurs modifications sont nécessaire :

  1. Type exporté : Déclarez Bar (anciennement bar) comme type exporté en mettant sa première lettre en majuscule.
  2. Champs exportés : Exportez les champs B et BB en commençant leurs noms par une majuscule lettres.
  3. Méthode String() : Implémentez la méthode String() pour Bar (anciennement bar).

En implémentant ces modifications, fmt.Println accéder à la fois à la méthode String() et aux champs exportés, lui permettant de produire le résultat souhaité. sortie :

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

Sortie :

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

Conclusion

Compréhension du statut d'exportation et des limitations d'accessibilité sur le terrain dans Go explique pourquoi fmt.Println n'utilise pas intrinsèquement les méthodes String() pour les membres de la structure. En résolvant ces problèmes via des conventions d'exportation appropriées, le comportement souhaité peut être obtenu, favorisant la clarté et la cohérence du code.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal