avoir du mal à travailler avec des champs struct en utilisant reflect
package. en particulier, n'ont pas compris comment définir la valeur du champ.
tapez t struct {fi int; chaîne fs} var rt = t {123, "jblow"} var i64 int64 = 456
obtenir le nom du champ i - cela semble fonctionner
var field = reflect.TypeOf(r).Field(i).Name
obtenir la valeur du champ i comme a) interface {}, b) int - cela semble fonctionner
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
réglage de la valeur du champ i - essayer un - panique
reflect.ValueOf(r).Field(i).SetInt( i64 )
panique : reflect.Value · SetInt en utilisant la valeur obtenue en utilisant un champ non exporté
en supposant qu'il n'aime pas les noms de champ "id" et "nom", alors renommé en "Id" et "Nom"
a) cette hypothèse est-elle correcte?
b) si correct, jugé inutile car dans le même fichier / package
réglage de la valeur du champ i - essayez deux (avec les noms de champ en majuscule) - panique
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
panique : reflect.Value · SetInt utilisant une valeur non adressable
Les instructions ci-dessous par @peterSO sont complètes et de haute qualité
Quatre. cela marche:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
il atteste également que les noms de champs doivent être exportables (commencer par une majuscule)
la source
reflect
pour définir des données était comments.gmane.org/gmane.comp.lang.go.general/35045 , mais même là, il faisaitjson.Unmarshal
le sale boulotRéponses:
Go est disponible en code open source . Un bon moyen d'en apprendre davantage sur la réflexion est de voir comment les principaux développeurs de Go l'utilisent. Par exemple, les packages Go fmt et json . La documentation du package contient des liens vers les fichiers de code source sous la rubrique Fichiers du package.
Le package Go json rassemble et annule le JSON depuis et vers les structures Go.
Voici un exemple étape par étape qui définit la valeur d'un
struct
champ tout en évitant soigneusement les erreurs.Le
reflect
package Go a uneCanAddr
fonction.Le
reflect
package Go a uneCanSet
fonction qui, sitrue
, implique queCanAddr
c'est aussitrue
.Nous devons nous assurer que nous pouvons
Set
lestruct
terrain. Par exemple,Si nous pouvons être certains que toutes les vérifications d'erreurs ne sont pas nécessaires, l'exemple se simplifie en,
la source
Cela semble fonctionner:
Impressions:
la source