具有以下功能:

const (
    Flag1 = 0
    Flag2 = uint64(1) << iota
    Flag3      
    Flag4      
    Flag5      
)

有没有一种更短/更好的方法,我想把它们都做一遍:

const FlagAll = Flag1 | Flag2 | Flag3 | Flag4 | Flag5

推荐答案

因为您的所有标志都包含一个1位,所以将位向左移动,FlagAll将是该行中的下一个位,但减go 1:

const (
    Flag1 = 0
    Flag2 = uint64(1) << iota
    Flag3
    Flag4
    Flag5
    FlagAll = uint64(1)<<iota - 1
)

测试:

fmt.Printf("%08b\n", Flag1)
fmt.Printf("%08b\n", Flag2)
fmt.Printf("%08b\n", Flag3)
fmt.Printf("%08b\n", Flag4)
fmt.Printf("%08b\n", Flag5)
fmt.Printf("%08b\n", FlagAll)

这将输出(在Go Playground上试用):

00000000
00000010
00000100
00001000
00010000
00011111

请注意,如果将最后一个常量左移并减go 1,则得到相同的值:

const FlagAll2 = Flag5<<1 - 1

但这需要显式包括最后一个常量(Flag5),而第一个解决方案不需要它(您可以添加更多标志,如Flag6Flag7...和FlagAll将是正确的值,而不更改它).

Go相关问答推荐

golang父进程的副本无法进行https/tls调用并获得tls:未能验证证书""

Gorm foreign 密钥

GetSecretValue,get identity:get credentials:无法刷新缓存的凭据

AWS S3 SelectObjectContent在AWS SDK v2 for Go中不返回结果

允许在 struct 中使用复合作为函数参数

";无效的复制因子;融合Kafka Go客户端

nixOS 上的 Nginx 反向代理在try 加载 css/js 时返回 404

使用 Go 根据 /etc/shadow 文件中的散列密码验证密码

判断一个区域内的纬度/经度点

Go 切片容量增长率

将值发送到 Channel 并在就绪时读取输出

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

在 Go 模板中对照片使用随机 Int

不能在 *gorm.db 而不是 gorm.db 上使用 WithContext(ctx) 方法

将 .gz 文件添加到 tar.gz 文件,但在添加之前解码 gz.输出文件被剪辑(损坏)

GRPC 元数据未在 Go 中更新

如何将具有嵌入式 struct 的 struct 展平为 json

此代码如何生成内存对齐切片?

Go 并发、goroutine 同步和关闭通道

如何在 Unmarshal 中使用泛型(转到 1.18)