Maison > développement back-end > Golang > Comment les programmeurs peuvent-ils alphabétiser la sortie du champ Struct en Go ?

Comment les programmeurs peuvent-ils alphabétiser la sortie du champ Struct en Go ?

Linda Hamilton
Libérer: 2024-11-23 00:27:11
original
810 Les gens l'ont consulté

How Can Programmers Alphabetize Struct Field Output in Go?

Modification de la sortie d'impression des structures : faciliter la disposition alphabétique des champs

Comment les programmeurs peuvent-ils générer des sorties de données structurées en faisant apparaître les champs dans un ordre alphabétique ? Plus précisément, considérez ce qui suit :

type T struct {
    B int
    A int
}

t := &T{B: 2, A: 1}

doSomething(t)

fmt.Println(t)  // Desired output: &{1 2} — Fields sorted alphabetically
Copier après la connexion

Solution via l'ordre des champs :

Par défaut, les structures conservent l'ordre des champs déclaré. Ainsi, en redéfinissant la structure avec la séquence de champs souhaitée, le résultat peut être obtenu :

type T struct {
    A int
    B int
}
Copier après la connexion

Solution via l'interface Stringer :

Une autre approche consiste à implémenter le Stringer interface pour la struct :

func (t T) String() string {
    return fmt.Sprintf("{%d %d}", t.A, t.B)
}
Copier après la connexion

Le package fmt vérifie l'implémentation Stringer et utilise sa méthode String() pour la sortie génération.

Solution via la réflexion :

Pour plus de flexibilité entre les structures, la réflexion peut être utilisée. Les noms de champs peuvent être obtenus, triés et leurs valeurs correspondantes récupérées.

func printFields(st interface{}) string {
    t := reflect.TypeOf(st)

    names := make([]string, t.NumField())
    for i := range names {
        names[i] = t.Field(i).Name
    }
    sort.Strings(names)

    v := reflect.ValueOf(st)
    buf := &bytes.Buffer{}
    buf.WriteString("{")
    for i, name := range names {
        val := v.FieldByName(name)
        if !val.CanInterface() {
            continue
        }
        if i > 0 {
            buf.WriteString(" ")
        }
        fmt.Fprintf(buf, "%v", val.Interface())
    }
    buf.WriteString("}")

    return buf.String()
}
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