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
881 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!

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