我想在没有索引名称的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中执行此操作?
也许我需要新的数据类型? :)
请帮帮我!谢谢!
答案 0 :(得分:2)
该键被解释为结构文字的字段名称,数组和切片文字的索引以及地图文字的键。 对于地图文字,所有元素都必须有一个键。指定具有相同字段名称或常量键值的多个元素是错误的。
所以不,使用复合文字初始化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)。如果你会做很多界面{}并反思它 - 这是可能的,但这很痛苦。