如何使用go在没有索引名称的hashmap中存储值?

时间:2017-01-31 09:43:22

标签: arrays dictionary go hashmap slice

我想在没有索引名称的hashmap中存储一些值。我的意思是从数组和hashmap派生。

示例:

{"name":"attn",1,5,6,7,8}

变量输出(仅用于演示):

( "name" : "attn", 0:1, 1:5, 2:6, 3:7, 4:8, )

或另一个例子:

{ 0:"start","name":"mattn","age":39,"child":[1,2,3,4,5,9:1] }

如何在Go中执行此操作?

也许我需要新的数据类型? :)

请帮帮我!谢谢!

2 个答案:

答案 0 :(得分:2)

Spec: Composite literals:

  

该键被解释为结构文字的字段名称,数组和切片文字的索引以及地图文字的键。 对于地图文字,所有元素都必须有一个键。指定具有相同字段名称或常量键值的多个元素是错误的。

所以不,使用复合文字初始化map,我们不能省略键。

我们可能(通常我们会)在使用切片文字时省略索引。因此,我们可以在一个映射文字中列出键值对(我们知道或者想要显式地声明键),并在另一个切片文字中列出具有后续索引的元素以初始化切片。然后我们可以迭代切片并根据索引值对添加键值对。

你的第一个例子:

m := map[interface{}]interface{}{
    "name": "attn",
}
s := []int{1, 5, 6, 7, 8}
for i, v := range s {
    m[i] = v
}
fmt.Println(m)

输出:

map[0:1 1:5 2:6 3:7 4:8 name:attn]

你的另一个例子:

m = map[interface{}]interface{}{
    0: "start", "name": "mattn", "age": 39,
    "child": []int{1: 1, 2, 3, 4, 5, 9: 1},
}
fmt.Println(m)

输出:

map[0:start name:mattn age:39 child:[0 1 2 3 4 5 0 0 0 1]]

Go Playground上尝试这些。

请注意,在第二个示例中,"child"的值是包含0个元素的切片。原因是因为切片或数组是连续的,即使我们不为所有索引提供元素,仍然会有缺失索引的元素。如果我们不想要这个,那不是切片(或数组),而是map,我们可以初始化它,如第一个例子所示。

我们无法区分隐式0和显式0(我们可能会在复合文字中列出)。如果0是我们可能使用的值,则另一种方法是将child的类型定义为[]interface{},如果我们没有在复合文字中明确指定值,则将是nil

有关初始化数组和切片的更多示例,请参阅此问题:Keyed items in golang array initialization

答案 1 :(得分:1)

您可以这样做:

package main

import "fmt"

func main() {
    dynMap := map[interface{}]interface{}{
        "name": "attn",
        0:      1,
        1:      5,
        2:      6,
        3:      7,
        4:      8,
    }
    fmt.Printf("%v\n", dynMap)

    dynMap2 := map[interface{}]interface{}{
        0:       "start",
        "name":  "mattn",
        "age":   39,
        "child": []int{1, 2, 3, 4, 5, 9:1}, 

    }
    fmt.Printf("%v\n", dynMap2)
}

除了“孩子”:[1,2,3,4,5,9:1] - 我无法理解你真正想要的东西[9:1] 感谢您的纠正:这也是可行的。

而且,虽然我也喜欢python,但go不是python(或js / ruby​​ / etc)。如果你会做很多界面{}并反思它 - 这是可能的,但这很痛苦。