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

有点卡住了。


我正在尝试找出如何使用 go 枚举从 const 获取位掩码值。比如key是5,也就是0101位,就是dog和fish。获取位值(1、2、4、8、16、32、64 等)以便我可以选择字符串值并返回一组动物的最简单方法是什么?


type Key int


const (

    Dog Key = 1 << iota

    Cat

    Fish

    Horse

    Snake

    Rabbit

    Lion

    Rino

    Hedgehog

)

一直在阅读,但我无法解决这个问题。


ITMISS
浏览 131回答 2
2回答

慕姐4208626

声明一段字符串,其中字符串对应于常量名称: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 uintconst (    Dog Key = iota    Cat    Fish    Horse    Snake    Rabbit    Lion    Rino    Hedgehog)//go:generate stringer -type=Keyfunc 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}

LEATH

使用 iota 创建位掩码值 Iota 在创建位掩码时非常有用。例如,为了表示可能是安全的、经过身份验证的和/或就绪的网络连接状态,我们可以创建如下所示的位掩码:package mainimport "fmt"const (&nbsp; &nbsp; Secure = 1 << iota // 0b001&nbsp; &nbsp; Authn&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 0b010&nbsp; &nbsp; Ready&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 0b100)// 0b011: Connection is secure and authenticated, but not yet Readyfunc main() {&nbsp; &nbsp; ConnState := Secure | Authn&nbsp; &nbsp; fmt.Printf(`&nbsp; &nbsp; Secure:&nbsp; &nbsp; 0x%x (0b%03b)&nbsp; &nbsp; Authn:&nbsp; &nbsp; &nbsp;0x%x (0b%03b)&nbsp; &nbsp; ConnState: 0x%x (0b%03b)&nbsp; &nbsp; `, Secure, Secure, Authn, Authn, ConnState, ConnState)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go