在Golang中制作哈希数组

时间:2017-04-12 21:15:50

标签: arrays go multidimensional-array hash

我是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'}} 
    ...,
    ... ]

2 个答案:

答案 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{}{}的东西(地图切片,其键是字符串,其值可以有任何类型)

要打破它:

  1. [] - 切片之后的任何类型
  2. map - 内置地图(想想哈希)
  3. [string] - 方括号内是地图键的类型, 可以几乎任何类型
  4. interface{} - 地图值的类型
  5. {} - 初始化/分配整个事情
  6. 所以你在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"}},
    }