【发布时间】:2021-09-01 11:23:10
【问题描述】:
我想创建一个动态初始化的位图数据结构。我正在尝试为此使用 golang 地图:
type Register map[bool]*[]bool
我初始化地图的方式是:
register := make(Register)
register[true] := make(*[]bool, len(arr)) // arr is the array for which i want to create the bitmap
这显然会产生错误的编译问题:
error: cannot make type *[]bool
我也尝试过使用指针语法:
register[true] = &(make([]bool, len(arr)))
这给了我错误:
cannot take the address of make([]bool, len(arr))
我希望地图值为*[]bool 的原因是为了使回写到地图的内容保持正常和原位。
虽然 go 不会抱怨 map[bool]*[]bool 因此它是一个有效的类型。
如果它是有效的,那么以我想要的方式使用它的惯用方式是什么。如果不是,那另一种方法是什么?
【问题讨论】:
-
我不清楚为什么你首先想要一个指向切片的指针;你能澄清一下吗?切片已经是引用类型,想要一个指向它的指针是很奇怪的——确切的用例是什么?
-
除非你正在做一些高并发和序列化对地图的访问,否则指向切片的指针可能不会比切片提供任何好处。
-
这听起来像XY problem。你想代表什么?正如其他人所指出的,指向 slice 的指针似乎是多余的——因为空 slice 可以用 nil 值表示——除非你想表示一个未初始化的状态。同样,如果我们对您的数据模型有清晰的了解,我们可以提供更好的帮助。
-
没错,但您为什么不想重新分配给地图呢?请注意,切片标题相当小,因此
m[key] = append(m[key], ...)很好 -
@IshanKhare 不。我认为对 append 的工作方式存在一些误解。见,tour.golang.org/moretypes/15。即使您使用指向切片的指针,也可能发生容量不足以容纳数据的情况,然后 append 可能会分配一个更大的数组来存储它,并且返回的切片将指向新的后备数组。