Maison >développement back-end >Golang >Comment imprimer les valeurs des structures imbriquées avec des pointeurs dans Go ?

Comment imprimer les valeurs des structures imbriquées avec des pointeurs dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-29 21:24:11196parcourir

How to Print the Values of Nested Structs with Pointers in Go?

Impression de valeurs de structure avec des pointeurs dans Go

Dans Go, il est courant de rencontrer des situations où vous devez imprimer la valeur d'une structure qui contient des pointeurs vers d’autres structures. Cependant, le comportement par défaut du spécificateur de format %v dans fmt.Printf() affiche l'adresse du pointeur au lieu de la valeur réelle.

Considérez l'exemple suivant :

package main

import "fmt"

type A struct {
    a int32
    B *B
}
type B struct {
    b int32
}

func main() {
    a := &A{
        a: 1,
        B: &B{
            b: 2,
        },
    }
    fmt.Printf("v ==== %+v \n", a)
}

La sortie de le code ci-dessus est :

v ==== &{a:1 B:0xc42000e204}

Comme vous pouvez le voir, le champ B est imprimé comme l'adresse mémoire de la structure B, et non comme son adresse réelle value.

Impression personnalisée avec l'interface Stringer

Une façon d'imprimer le contenu des structures imbriquées consiste à implémenter l'interface Stringer pour les types A et B. L'interface Stringer nécessite une seule méthode, String(), qui renvoie une représentation sous forme de chaîne de la valeur.

Voici un exemple mis à jour avec l'interface Stringer :

package main

import "fmt"

type A struct {
    a int32
    B *B
}

type B struct{ b int32 }

func (aa *A) String() string {
    return fmt.Sprintf("A{a:%d, B:%v}",aa.a,aa.B)
}

func (bb *B) String() string {
    return fmt.Sprintf("B{b:%d}",bb.b)
}

func main() {
    a := &A{a: 1, B: &B{b: 2}}

    // using the Stringer interface
    fmt.Printf("v ==== %v \n", a)

    // or just print it yourself however you want.
    fmt.Printf("v ==== A{a:%d, B:B{b:%d}}\n", a.a, a.B.b)

    // or just reference the values in the struct that are structs themselves
    // but this can get really deep
    fmt.Printf("v ==== A{a:%d, B:%v}", a.a, a.B)
}

Maintenant, la sortie est :

v ==== A{a:1, B:B{b:2}}

Impression manuelle

Si vous ne souhaitez pas mettre en œuvre le Interface Stringer, vous pouvez imprimer manuellement la représentation souhaitée de la structure à l'aide des instructions d'impression. Par exemple, vous pouvez accéder aux champs de la structure imbriquée et les imprimer séparément :

fmt.Printf("v ==== A{a:%d, B:B{b:%d}}\n", a.a, a.B.b)

Cette approche vous donne un contrôle complet sur le format de la sortie.

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