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!