我正在处理从字节数组到二维列表的映射,其单独的列表元素是无符号 32 位整数。即 map[[8]byte][][]uint32
目前,我有检查二维列表是否已填充的逻辑,如果没有,我会添加两个空列表。从那里我可以开始实际填写这些列表。像这样:
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 是否有办法在创建新映射时使用内部列表自动填充 map 的 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))
最佳答案
slice 的默认值为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)
}
但是,您的情况比较棘手,因为您的值是 slice 的 slice 。默认的 nil
在这种情况下不起作用,因为您要使用 my_map[x][0]
取消引用 nil
。因此,您必须明确检查 [0]
索引是否已分配。恕我直言,没有什么特别低效的。它的优点是显式,因此您可以准确地看到事物分配的位置。
如果您愿意,可以将此功能封装到一个函数中。
关于dictionary - 是否可以在创建新映射时初始化映射的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54724467/