我是Go的新手,在嵌套数据结构方面遇到了一些麻烦。下面是我嘲笑的一系列哈希,我需要在Golang中制作。我只是混淆了整个必须预先声明变量类型和诸如此类的东西。有任何想法吗?
var Array = [
{name: 'Tom', dates: [20170522, 20170622], images: {profile: 'assets/tom-profile', full: 'assets/tom-full'}},
{name: 'Pat', dates: [20170515, 20170520], images: {profile: 'assets/pat-profile', full: 'assets/pat-full'}}
...,
... ]
答案 0 :(得分:2)
Ruby中所谓的'hash'在Go中称为'map'(将键转换为值)。
但是,Go是statically typechecked language。地图只能将某种类型映射到另一种类型,例如map [string] int将字符串值映射到integeger。这不是你想要的。
所以你想要的是一个结构。实际上,您需要事先定义类型。所以你会做什么:
// declaring a separate 'Date' type that you may or may not want to encode as int.
type Date int
type User struct {
Name string
Dates []Date
Images map[string]string
}
现在已定义此类型,您可以在其他类型中使用它:
ar := []User{
User{
Name: "Tom",
Dates: []Date{20170522, 20170622},
Images: map[string]string{"profile":"assets/tom-profile", "full": "assets/tom-full"},
},
User{
Name: "Pat",
Dates: []Date{20170515, 20170520},
Images: map[string]string{"profile":"assets/pat-profile", "full": "assets/pat-full"},
},
}
注意我们如何将User定义为结构,但将图像定义为字符串到图像的映射。您还可以定义单独的图像类型:
type Image struct {
Type string // e.g. "profile"
Path string // e.g. "assets/tom-profile"
}
然后,您不会将图像定义为map[string]string
,而是定义为[]Image
,即图像结构的切片。哪一个更合适取决于用例。
答案 1 :(得分:2)
您不需要预先声明变量类型,至少在这个简单示例中不是这样,尽管您需要提及"提及"使用复合文字初始化值时的类型。
例如,这个[{}]
(对象数组?)对Go编译器没有任何意义,相反,你需要编写类似于[]map[string]interface{}{}
的东西(地图切片,其键是字符串,其值可以有任何类型)
要打破它:
[]
- 切片之后的任何类型map
- 内置地图(想想哈希)[string]
- 方括号内是地图键的类型,
可以几乎任何类型interface{}
- 地图值的类型{}
- 初始化/分配整个事情所以你在Go中的例子看起来像这样:
var Array = []map[string]interface{}{
{"name":"Tom", "dates": []int{20170522, 20170622}, "images": map[string]string{"profile": "assets/tom-profile", "full": "assets/tom-full"}},
{"name":"Pat", "dates": []int{20170515, 20170520}, "images": map[string]string{"profile": "assets/pat-profile", "full": "assets/pat-full"}},
// ...
}
详细了解地图以及您可以在此处使用的关键类型:https://golang.org/ref/spec#Map_types
那就是说,在Go中,大多数情况下,你首先要更具体地定义你的结构化类型,然后使用它们而不是地图,所以这样的东西在Go中更有意义:
type User struct {
Name string
Dates []int
Images Images
}
type Images struct {
Profile string
Full string
}
var Array = []User{
{Name:"Tom", Dates:[]int{20170522, 20170622}, Images:Images{Profile:"assets/tom-profile", Full:"assets/tom-full"}},
{Name:"Pat", Dates:[]int{20170515, 20170520}, Images:Images{Profile:"assets/pat-profile", Full:"assets/pat-full"}},
}