亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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條經驗 獲得超7個贊

使用 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 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號