Je suis assez nouveau à Golang. Je sais qu'il y a Struct à Golang. Mais pour tout ce que je sais, vous devez définir la structure
type Circle struct{
x,y,r float64
}
Je me demande comment vous pouvez déclarer une nouvelle variable qui n'existe pas dans le Struct
circle := new(Cirlce)
circle.color = "black"
Merci d'avance.
Vous devrez utiliser une carte (de type map[string]interface{}
) pour travailler avec du JSON dynamique. Voici un exemple de création d'une nouvelle carte:
// Initial declaration
m := map[string]interface{}{
"key": "value",
}
// Dynamically add a sub-map
m["sub"] = map[string]interface{}{
"deepKey": "deepValue",
}
Démasquer JSON dans une carte ressemble à ceci:
var f interface{}
err := json.Unmarshal(b, &f)
Le code ci-dessus vous laisserait une carte dans f
, avec une structure ressemblant à:
f = map[string]interface{}{
"Name": "Wednesday",
"Age": 6,
"Parents": []interface{}{
"Gomez",
"Morticia",
},
}
Vous devrez utiliser une assertion de type pour y accéder, sinon Go ne saura pas que c'est une carte:
m := f.(map[string]interface{})
Vous devrez également utiliser des assertions ou des commutateurs de type sur chaque élément que vous retirez de la carte. Gérer un JSON non structuré est un problème.
Plus d'information:
Tu ne peux pas. Go est typé statiquement et ne permet pas de telles constructions.
Les structures ont une disposition en mémoire directement liée à la définition, et il n'y a aucun endroit où stocker de tels champs supplémentaires.
Vous pouvez utiliser une carte à la place. De plus, vous pouvez utiliser &circle
en tant que clé ou partie de clé, pour associer des éléments de carte à des structures arbitraires.
type key struct {
target interface{}
field string
}
x := make(map[key]string)
x[key{ target: circle, field: "color" }] = "black"
J'ai commencé à travailler sur ce petit référentiel https://github.com/Ompluscator/dynamic-struct
Il est possible à ce stade d'étendre la structure existante lors de l'exécution, en passant une instance de structure et en modifiant des champs (ajout, suppression, modification de types et de balises).
Toujours en cours, alors ne vous attendez pas à quelque chose d'énorme :)
EDIT: À ce stade, le travail sur la bibliothèque est terminé, et il semble stable pendant quelques mois :)