我正在处理一个从字节数组到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))
答案 0 :(得分:1)
切片的默认值为nil
,append
可以使用。您可以这样做:
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]
索引是否已分配。恕我直言,没有什么特别低效的。它具有显式的优点,因此您可以确切地看到在哪里分配内容。
如果愿意,可以将此功能封装到一个函数中。