Accès dynamique à une propriété de structure dans Golang
On peut rencontrer le besoin d'accéder et de mettre à jour dynamiquement les propriétés d'une structure dans Go. Ceci peut être réalisé à l'aide du package Reflect, qui permet la réflexion à l'exécution et la manipulation des types et des valeurs.
Pour définir un champ d'une structure par son nom, vous pouvez utiliser le package Reflect pour récupérer la valeur du champ et lui attribuer une nouvelle valeur. Voici une fonction qui implémente cette fonctionnalité :
// setField sets field of v with given name to given value. func setField(v interface{}, name string, value string) error { // v must be a pointer to a struct rv := reflect.ValueOf(v) if rv.Kind() != reflect.Ptr || rv.Elem().Kind() != reflect.Struct { return errors.New("v must be pointer to struct") } // Dereference pointer rv = rv.Elem() // Lookup field by name fv := rv.FieldByName(name) if !fv.IsValid() { return fmt.Errorf("not a field name: %s", name) } // Field must be exported if !fv.CanSet() { return fmt.Errorf("cannot set field %s", name) } // We expect a string field if fv.Kind() != reflect.String { return fmt.Errorf("%s is not a string field", name) } // Set the value fv.SetString(value) return nil }
Pour utiliser cette fonction, vous l'appelleriez ainsi :
var config SshConfig ... err := setField(&config, split[0], strings.Join(split[1:], " ")) if err != nil { // handle error }
Cette approche vous permet de définir dynamiquement la valeur d'une structure champ sans avoir besoin d'instructions if-else explicites ou de changement de casse.
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!