2016-11-12 2 views
1

Ich bin ziemlich neu in Golang. Ich weiß, dass es in Golang Struct gibt. Aber für alles, was ich weiß, haben Sie structGolang dynamic creating Mitglied von Struct

type Circle struct{ 
    x,y,r float64 
} 

ich definieren frage mich, wie Sie eine neue Variable deklarieren können, die in der Struct existiert nicht

circle := new(Cirlce) 
circle.color = "black" 

Thx im Voraus.

Antwort

8

Sie müssen eine Karte verwenden (vom Typ map[string]interface{}) mit dynamischer JSON zu arbeiten. Hier ist ein Beispiel eine neue Karte erstellen:

// Initial declaration 
m := map[string]interface{}{ 
    "key": "value", 
} 

// Dynamically add a sub-map 
m["sub"] = map[string]interface{}{ 
    "deepKey": "deepValue", 
} 

Unmarshalling JSON in eine Karte wie folgt aussieht:

var f interface{} 
err := json.Unmarshal(b, &f) 

Der obige Code Sie mit einer Karte verlassen würde in f, mit einer Struktur ähnelt:

f = map[string]interface{}{ 
    "Name": "Wednesday", 
    "Age": 6, 
    "Parents": []interface{}{ 
     "Gomez", 
     "Morticia", 
    }, 
} 

Sie müssen eine Art Behauptung verwenden, darauf zuzugreifen, andernfalls gehen nicht wissen, dass es eine Karte ist:

m := f.(map[string]interface{}) 

Sie müssen für jedes Element, das Sie aus der Karte ziehen, auch Assertionen oder Typenschalter verwenden. Der Umgang mit unstrukturiertem JSON ist mühsam.

Weitere Informationen:

1

Sie können nicht. Go ist statisch typisiert und lässt solche Konstrukte nicht zu.

Strukturen haben ein Layout im Speicher, das sich direkt auf die Definition bezieht, und es gibt keinen Speicherort für solche zusätzlichen Felder.

Sie können stattdessen eine Karte verwenden. Darüber hinaus können Sie &circle als Schlüssel oder Teil eines Schlüssels verwenden, um Kartenelemente mit beliebigen Strukturen zu verknüpfen.

type key struct { 
    target interface{} 
    field string 
} 

x := make(map[key]string) 
x[key{ target: circle, field: "color" }] = "black" 
+0

Vielleicht muss ich meine Frage an-Satz wieder. Nehmen wir an, ich möchte einen JSON-Körper konstruieren. Ich weiß nicht, was die interne Struktur des JSON ist. Wie kann ich eine Karte so erstellen? –

+0

Gehen Sie durch https://tour.golang.org, wo Sie Karten und viele andere Dinge finden, die Sie benötigen. Dann, wie andere sagen, ist 'map [string] interface {}' der Typ für ein JSON-Objekt mit unbekannten Schlüsseln und Werttypen (und '[] interface {}' ist ein JSON-Array mit unbekannten Elementtypen). – twotwotwo