猿问

Golang 如何使用 make 创建地图到指针到切片

我想创建一个动态初始化的位图数据结构。我正在尝试使用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不会抱怨,因此它是一种有效的类型。
如果它有效,那么以我想要的方式使用它的idomatic方式是什么。如果不是,那么替代方法是什么?map[bool]*[]bool


鸿蒙传说
浏览 129回答 2
2回答

UYOU

使用以下代码创建指向切片的指针:register := make(Register)s := make([]bool, len(arr)) // create addressable slice value s.register[true] = &s您可以使用 来消除变量声明,但此方法不会减少代码行数,而是添加另一个映射索引操作。newregister := make(Register)register[true] = new([]bool)*register[true] = make([]bool, len(arr))声明一个函数以将赋值移动到一行:func makeSlice(n int) *[]bool {    s := make([]bool, len(arr))    return &s}...register := Register{true: makeSlice(len(arr))}由于映射键有两个可能的值(true 和 false),因此可以使用结构而不是映射来简化代码:type Register struct {    t, f []bool}register := Register{t: make([]bool, len(arr))}中的结构字段是可寻址的,因此您可以使用 来获取 .register&register.t*[]bool此主题的变体是使用数组:type Register [2][]boolregister := Register{1: make([]bool, len(arr))}如果仅修改切片元素而不修改切片值,则无需使用指向切片的指针。type Register map[bool][]boolregister := make(Register)register[true] := make([]bool, len(arr))如果确实修改了切片值,则 可能会更有效且更易于使用。修改切片值时,应用程序需要赋回地图,但要消除间接寻址。map[bool][]bool

凤凰求蛊

另一个选项是使用函数:newpackage mainimport "fmt"func main() {   type Register map[bool]*[]bool   register := make(Register)   register[true] = new([]bool)   // main.Register{true:(*[]bool)(0xc000004078)}   fmt.Printf("%#v\n", register)}https://golang.org/pkg/builtin#new
随时随地看视频慕课网APP

相关分类

Go
我要回答