创建新映射后,是否可以初始化映射的值?

时间:2019-02-16 15:10:08

标签: dictionary go

我正在处理一个从字节数组到2D列表的映射,其单独的列表元素是无符号的32位整数。即map[[8]byte][][]uint32

当前,我具有检查2D列表是否被填充的逻辑,如果没有,则添加两个空列表。从那里我可以开始填写这些列表。像这样:

my_map := make(map[[8]byte][][]uint32)
/* Some logic to define x and i */
if len(my_map[x]) == 0 {
    /* Create two fresh inner-lists */
}
my_map[x][0] = append(my_map[x][0], uint32(i))

但是,这并不是最优雅,也不高效的解决方案。我想知道GO是否可以在创建新映射时自动使用内部列表填充地图的2D列表值。或者,如果有更好的数据类型要使用,我全神贯注。

本质上,这就是我想要做的:

my_map := make(map[[8]byte][][]uint32)
/* Some logic to define x and i */
my_map[x][0] = append(my_map[x][0], uint32(i))

1 个答案:

答案 0 :(得分:1)

切片的默认值为nilappend可以使用。您可以这样做:

package main

import "fmt"

func main() {
    m := make(map[string][]int)
    m["test0"] = append(m["test0"], 10)
    m["test1"] = append(m["test1"], 10)
    m["test2"] = append(m["test2"], 10)
    fmt.Println(m)
}

但是,您的情况比较棘手,因为您的值是片片。在这种情况下,默认的nil将不可用,因为您要使用nil来引用my_map[x][0]。因此,您必须明确检查[0]索引是否已分配。恕我直言,没有什么特别低效的。它具有显式的优点,因此您可以确切地看到在哪里分配内容。

如果愿意,可以将此功能封装到一个函数中。