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
Linda Hamiltonoriginal
2024-11-23 00:27:11856parcourir

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

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
}

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)
}

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()
}

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