Go iota + 位运算 做出漂亮的权限位掩码常量
技术百科
舞夢輝影
发布时间:2026-01-17
浏览: 次 权限掩码用Go的iota配合位运算定义,简洁类型安全且直观;需手动设iota起始值为1以生成1、2、4、8…幂次序列。
用 Go 的 iota 配合位运算定义权限掩码,既简洁又类型安全,还能让代码一眼看出权限组合关系。
用 iota 从 1 开始生成 2 的幂次
默认 iota 从 0 开始,但权限位需要 1, 2, 4, 8...,所以手动重置起始值:
const (
Read = 1 << iota // 1 << 0 = 1
Write // 1 << 1 = 2
Delete // 1 << 2 = 4
Admin // 1 << 3 = 8
)
这样每个常量天然互斥,且支持按位或组合(如 Read | Write)。
分组 + 注释增强可读性
实际项目中权限常分维度(如资源、操作、范围),可用空行和注释分组,iota 在每个 const 块内独立计数:
const (
// 资源权限
PermUser = 1 << iota // 1
PermOrder // 2
PermProduct // 4
// 操作权限
PermCreate // 8(iota 从 3 开始,1<<3)
PermUpdate // 16
PermDelete // 32
// 系统级权限
PermLogin // 64(iota = 6)
PermAdmin // 128
)
注意:不同分组间数值不重叠,靠位移位置自然隔离,避免手动写数字出错。
定义常用组合权限常量
高频组合直接封装成新常量,提升语义清晰度:
const (
PermReadUser = PermUser | PermRead
PermReadWrite = PermReadUser | PermUpdate
PermFullUser = PermUser | PermCreate | PermUpdate | PermDelete
PermSuperAdmin = PermAdmin | PermLogin | PermFullUser
)
这些组合仍为整型常量,参与位运算完全兼容,调用方无需关心底层位结构。
校验权限的推荐写法
检查某权限是否包含在权限集中,用按位与(&)判断:
-
正确:
if userPerms&PermWrite != 0 { ... } -
错误:
if userPerms == PermWrite { ... }(忽略组合权限) - 批量校验可写成:
if userPerms&(PermRead|PermWrite) == (PermRead|PermWrite) { ... }
搭配 Go 1.21+ 的 bits.OnesCou 还能统计开启的权限数量,便于调试。
# 能让
# 还能
# go
# 值为
# if
# 封装
# 整型
# const
# 掩码
# 仍为
# 常量
# 互斥
# iota
# 成新
# 在每个
# Admin
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- PHP主流架构如何处理会话管理_Session与C
- Win11怎么打开旧版计算器_Win11恢复传统计
- Win11怎么关闭粘滞键_彻底禁用Windows
- Win10怎么关闭自动更新错误弹窗_Win10策略
- Windows如何使用注册表查找和删除项?(reg
- 如何使用Golang benchmark测量函数延
- Windows 11无法安全删除U盘提示设备正在使
- 如何在 Go 中高效缓存与分发网络视频流
- Golang如何实现基本的用户注册_Golang用
- 如何在Golang中引入测试模块_Golang测试
- Win11任务栏怎么放到顶部_Win11修改任务栏
- 如何使用Golang实现文件加密_Golang c
- c++ reinterpret_cast怎么用 c
- Python日志系统设计与实现_高可观测性架构实战
- 如何使用Golang搭建Web开发环境_快速启动H
- Windows任务计划服务异常原因_任务调度失败的
- Python数据抓取合法性_合规说明【指导】
- Win11怎么清理C盘系统日志_Win11清理系统
- 如何在 Go 中调用动态链接库(.so)中的函数
- 用Python构建微服务架构实践_FastAPI与
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- Windows10如何更改鼠标灵敏度_Win10鼠
- Win11如何设置ipv6 Win11开启IPv6
- 用lighttpd能运行php吗_lighttpd
- Win11讲述人怎么关闭_Win11误触开启语音朗
- php8.4如何调用com组件_php8.4win
- PHP 中如何在函数内持久化修改引用变量的指向
- 一文详解网站被黑客入侵挂马解决办法
- 如何在Golang中实现RPC异步返回_Golan
- Win11怎么更改默认打开方式_Win11关联文件
- Windows 11登录时提示“用户配置文件服务登
- Win11怎么看电池循环次数_Win11笔记本电池
- php怎么下载安装后设置默认字符集_utf8配置步
- Win11如何设置鼠标灵敏度_Win11鼠标灵敏度
- 如何使用Golang构建基础消息队列模拟_Gola
- php查询数据怎么分组_groupby分组查询配合
- 如何在Golang中定义接口_抽象方法和多态实现
- 如何使用Golang log设置日志输出格式_Go
- 如何使用 Python 合并文件夹内多个 Exce
- Go 语言标准库为何不提供泛型 Contains
- Win11怎么关闭VBS安全性_Windows11
- Win10电脑怎么设置网络名称_Windows10
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- Windows10蓝屏SYSTEM_SERVICE
- XML的“混合内容”是什么 怎么用DTD或XSD定
- Win10怎么查看内存时序参数_Win10CPU-
- Python变量绑定机制_引用模型解析【教程】
- Win11怎么关闭自动调节屏幕亮度_Windows
- php命令行怎么运行_通过CLI模式执行PHP脚本
- Windows如何使用BitLocker To G

QQ客服