2016-11-12 65 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