我正在使用 flag 包在 Golang 中制作一個程式,我正在嘗試檢查特定串列中的多個標志是否為真。現在,這是我的解決方案:
List := 0
if *md5flag {
List
}
if *sha1flag {
List
}
if *sha256flag {
List
}
if *sha512flag {
List
}
if List > 1 {
// Do stuff
os.Exit(1)
}
是否有更簡單的方法來做到這一點,并使用單個 if 陳述句?
uj5u.com熱心網友回復:
如果您只需要檢查是否設定了最多一個標志并在這種情況下立即退出,您可以使用短路回圈,但我不確定它是否僅對 4 個值更具可讀性:
flags := []*bool{md5flag, sha1flag, sha256flag, sha512flag}
seenSetFlag := false
for _, f := range flags {
if *f {
if seenSetFlag {
os.Exit(1)
}
seenSetFlag = true
}
}
uj5u.com熱心網友回復:
Go 沒有任何從boolto 的轉換int,因此您需要以某種方式使用 if 陳述句。
我會做這樣的事情
package main
import (
"fmt"
)
func boolsToInt(flags... bool) int {
value := 0
for _, flag := range flags {
if flag {
value
}
}
return value
}
func main() {
b1, b2, b3, b4 := false, true, true, false
fmt.Println(boolsToInt(b1, b2, b3, b4))
}
uj5u.com熱心網友回復:
您可以使用位掩碼。但是,如果您將標志設定為位掩碼,那么位掩碼方法會更有效,即標志應該是可以進行 OR 運算的整數。bool在 Go 中不支持|運算子。
使用位掩碼,檢查是否設定了多個位,您可以使用技巧x & (x - 1) != 0。這會檢查是否x是 2 的冪,如果不是,則設定多于一位。(來源)
type alg int
const (
md5flag alg = 1 << iota
sha1flag
sha256flag
sha512flag
)
func main() {
// clients can initialize the value with bitwise-OR
supportedAlgos := md5flag | sha256flag
// check if more than one is set
if supportedAlgos & (supportedAlgos - 1) != 0 {
// do stuff
}
}
如果您不能重構您的代碼以使用位掩碼,您仍然可以從單個 bool 指標構造它。但是,這種方法與您現在所采用的方法沒有太大不同。
func toBitmask(bs ...*bool) int {
bitmask := 0
for i, b := range bs {
if b != nil && *b {
bitmask |= 1 << i
}
}
return bitmask
}
func main() {
list := toBitmask(md5flag, sha1flag, sha256flag, sha512flag)
if list & (list - 1) != 0 {
// do stuff
}
}
游樂場:https : //play.golang.org/p/PXK_1sS5ZxI
uj5u.com熱心網友回復:
你可以寫類似的東西
count = (flag1?1:0) (flag2?1:0) (flag3?1:0) (flag4?1:0);
if (count >= 2) { … }
這是否更具可讀性是您的決定。這當然是更少的代碼行。(在我的整個職業生涯中,我曾經遇到過這樣一種情況:我計算三個條件中是否至少有兩個為真)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358058.html
