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

在 Go 中使用位掩码(Go enumeration with iota)

在 Go 中使用位掩码(Go enumeration with iota)

Go
ITMISS 2023-06-01 18:04:11
有点卡住了。我正在尝试找出如何使用 go 枚举从 const 获取位掩码值。比如key是5,也就是0101位,就是dog和fish。获取位值(1、2、4、8、16、32、64 等)以便我可以选择字符串值并返回一组动物的最简单方法是什么?type Key intconst (    Dog Key = 1 << iota    Cat    Fish    Horse    Snake    Rabbit    Lion    Rino    Hedgehog)一直在阅读,但我无法解决这个问题。
查看完整描述

2 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

声明一段字符串,其中字符串对应于常量名称:


var animalNames = []string{

    "Dog",

    "Cat",

    "Fish",

    "Horse",

    "Snake",

    "Rabbit",

    "Lion",

    "Rino",

    "Hedgehog",

}

要获取位的名称,请循环遍历名称。如果设置了相应的位,则将名称添加到结果中:


func Names(k Key) []string {

    var result []string

    for i := 0; i < len(animalNames); i++ {

        if k&(1<<uint(i)) != 0 {

            result = append(result, animalNames[i])

        }

    }

    return result

}

在操场上运行它

如果将常量更改为位索引而不是位值,则可以使用stringer实用程序创建一个func (k Key) String() string. 这是此更改的代码:

type Key uint


const (

    Dog Key = iota

    Cat

    Fish

    Horse

    Snake

    Rabbit

    Lion

    Rino

    Hedgehog

)


//go:generate stringer -type=Key


func Names(k Key) []string {

    var result []string

    for animal := Dog; animal <= Hedgehog; animal++ {

        if k&(1<<animal) != 0 {

            result = append(result, animal.String())

        }

    }

    return result

}


查看完整回答
反对 回复 2023-06-01
?
LEATH

TA贡献1936条经验 获得超6个赞

使用 iota 创建位掩码值 Iota 在创建位掩码时非常有用。例如,为了表示可能是安全的、经过身份验证的和/或就绪的网络连接状态,我们可以创建如下所示的位掩码:


package main


import "fmt"


const (

    Secure = 1 << iota // 0b001

    Authn              // 0b010

    Ready              // 0b100

)


// 0b011: Connection is secure and authenticated, but not yet Ready


func main() {

    ConnState := Secure | Authn

    fmt.Printf(`    Secure:    0x%x (0b%03b)

    Authn:     0x%x (0b%03b)

    ConnState: 0x%x (0b%03b)

    `, Secure, Secure, Authn, Authn, ConnState, ConnState)

}


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

添加回答

举报

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