为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以在创建新映射时初始化映射的值?

是否可以在创建新映射时初始化映射的值?

Go
GCT1015 2023-06-05 19:38:05
我正在使用从字节数组到二维列表的映射,其单独的列表元素是无符号 32 位整数。IEmap[[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 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

切片的默认值为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不起作用,因为您正在取消引用nilwith my_map[x][0]。所以你必须明确检查[0]索引是否已经分配。恕我直言,没有什么特别低效的。它的优点是显式,因此您可以准确地看到事物分配的位置。


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


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信