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

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

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

Go
鸿蒙传说 2022-09-05 17:43:21
我想创建一个动态初始化的位图数据结构。我正在尝试使用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
查看完整描述

2 回答

?
UYOU

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

使用以下代码创建指向切片的指针:


register := make(Register)

s := make([]bool, len(arr)) // create addressable slice value s.

register[true] = &s

您可以使用 来消除变量声明,但此方法不会减少代码行数,而是添加另一个映射索引操作。new


register := 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][]bool

register := Register{1: make([]bool, len(arr))}

如果仅修改切片元素而不修改切片值,则无需使用指向切片的指针。


type Register map[bool][]bool

register := make(Register)

register[true] := make([]bool, len(arr))

如果确实修改了切片值,则 可能会更有效且更易于使用。修改切片值时,应用程序需要赋回地图,但要消除间接寻址。map[bool][]bool


查看完整回答
反对 回复 2022-09-05
?
凤凰求蛊

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

另一个选项是使用函数:new


package main

import "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


查看完整回答
反对 回复 2022-09-05
  • 2 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号