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

Comment la méthode `String()` de Go se comporte-t-elle avec les types intégrés et plusieurs méthodes promues ?

Barbara Streisand
Libérer: 2024-11-21 12:59:13
original
791 Les gens l'ont consulté

How Does Go's `String()` Method Behave with Embedded Types and Multiple Promoted Methods?

Interactions imprévues de la méthode String() dans les types Go intégrés

Comprendre les nuances du comportement de la méthode String() dans Go est crucial lorsque l'on travaille avec des types intégrés. Considérez l'extrait de code suivant :

type Engineer struct {
    Person
    TaxPayer
    Specialization string
}

type Person struct {
    Name string
    Age  int
}

func (p Person) String() string {
    return fmt.Sprintf("name: %s, age: %d", p.Name, p.Age)
}

type TaxPayer struct {
    TaxBracket int
}

func (t TaxPayer) String() string {
    return fmt.Sprintf("%d", t.TaxBracket)
}

func main() {
    engineer := Engineer{
        Person: Person{
            Name: "John Doe",
            Age:  35,
        },
        TaxPayer: TaxPayer{3},
        Specialization: "Construction",
    }
    fmt.Println(engineer)
}
Copier après la connexion

Le résultat de ce code est "nom : John Doe, âge : 35 3 Construction". Ce comportement, initialement déroutant, peut être expliqué en examinant comment les types intégrés interagissent avec la méthode String().

Promotions de types intégrés

Dans Go, les types intégrés permettent l'inclusion de champs et de méthodes d'autres types. Lorsqu'un type incorpore un autre type, les champs et méthodes du type incorporé sont promus au type d'incorporation, se comportant comme s'ils étaient définis sur le type d'incorporation. Dans notre exemple, le type Engineer intègre à la fois les types Person et TaxPayer.

Sélection de méthode

Lorsque la méthode String() est appelée sur un type intégré, le comportement par défaut consiste à sélectionner la méthode la moins profonde (la moins profondément imbriquée) portant ce nom. Cependant, s'il existe plusieurs méthodes String() promues à la même profondeur, l'expression du sélecteur devient illégale, ce qui entraîne une erreur de compilation.

Dans le code fourni, les types Person et TaxPayer ont String(). méthodes. Par conséquent, Engineer.String() est un sélecteur illégal. Par conséquent, aucune des méthodes String() n'est directement appelée lors de l'impression de la valeur Engineer.

Génération de chaîne de package fmt

Lorsqu'il n'y a pas de String() explicite définie pour un type struct, le package fmt s'appuie sur la représentation sous forme de chaîne par défaut, qui inclut l'impression des valeurs de champ. Dans la structure Engineer, cela donne la sortie "nom : John Doe, âge : 35 35 3 Construction."

Effet de la suppression des méthodes

Fait intéressant, la suppression de l'une ou l'autre personne .String() ou TaxPayer.String() résout l'ambiguïté, permettant à la méthode String() restante d'être utilisée pour la génération de chaînes. Cela souligne l'importance d'examiner attentivement les conventions de dénomination des méthodes lors de l'utilisation de types incorporés.

Conclusion

Le comportement de la méthode String() sur les types incorporés met en évidence le besoin de clarté et prospective dans la définition des méthodes. En comprenant les mécanismes de sélection et de promotion des méthodes, les développeurs peuvent éviter les sélecteurs ambigus et garantir des représentations sous forme de chaînes cohérentes de leurs types.

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