web-dev-qa-db-fra.com

Golang création dynamique membre de Struct

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.

11
UniSound Waterloo

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:

27
James Hillyerd

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"
2
nothingmuch

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

1
Marko Milojevic