2016-11-12 209 views
1

我對Golang來說還是比較新的。我知道Golang中有Struct。但就我所知,你必須定義結構Golang動態創建Struct的成員

type Circle struct{ 
    x,y,r float64 
} 

我想知道如何聲明不會在結構

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

THX預先存在的新的變量。

回答

8

您將需要使用地圖(的map[string]interface{}型)動態JSON工作。下面是一個創建新地圖的例子:

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

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

解組JSON成圖的樣子:

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

上面的代碼會留給你一個地圖中f,具有類似的結構:

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

您將需要使用一個類型斷言來訪問它,否則去不知道這是一個地圖:

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

您還需要在您從地圖中拉出的每個項目上使用斷言或類型開關。處理非結構化的JSON是一件麻煩事。

的更多信息:

1

你不能。 Go是靜態類型的,並且不允許這樣的構造。

結構在內存中有一個與定義直接相關的佈局,並且沒有存儲此類附加字段的位置。

您可以改爲使用地圖。此外,您可以使用&circle作爲鍵或鍵的一部分,將地圖元素與任意結構關聯。

type key struct { 
    target interface{} 
    field string 
} 

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

也許我需要重新短語我的問題。假設我想構建一個json主體。我不知道json的內部結構是什麼。我怎樣才能創建一個這樣的地圖? –

+0

瀏覽https://tour.golang.org,它會告訴你關於地圖和其他許多你需要的東西。然後,正如其他人所說,'map [string] interface {}'是具有未知鍵和值類型的JSON對象的類型([] interface {}是具有未知元素類型的JSON數組)。 – twotwotwo