You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言Bitmasking与位运算入门:两种权限判断写法结果差异求解

位掩码(Bitmasking)权限判断逻辑讲解

1. 先明确常量的实际值

你代码中用1 << iota生成的常量,每个对应一个独立的二进制位,具体值如下:

  • isAdmin = 1 << 0 = 1 → 二进制 00000001
  • isHeadquarters = 1 << 1 = 2 → 二进制 00000010
  • canSeeFinancials = 1 << 2 =4 → 二进制 00000100
  • canSeeAfrica = 1 << 3 =8 → 二进制 00001000
  • canSeeAsia = 1 <<4 =16 → 二进制 00010000
  • canSeeEurope = 1 <<5 =32 → 二进制 00100000
  • canSeeNorthAmerica =1 <<6 =64 → 二进制 01000000
  • canSeeSouthAmerica =1<<7=128 → 二进制 10000000

每个常量对应二进制的某一位为1,其他位为0,天然适合作为权限开关的标识。

2. roles变量的实际值计算

你代码中对roles的赋值是var roles byte = isAdmin | canSeeFinancials | canSeeEurope,这里的|是按位或运算符,规则是对应位只要有一个为1,结果位就为1,作用是把多个权限对应的位都设为1:

isAdmin:            00000001
canSeeFinancials:   00000100
canSeeEurope:       00100000
按位或结果:         00100101 → 十进制为37

所以roles的实际值是37,二进制00100101,同时包含了管理员、查看财务、查看欧洲数据三个权限。

3. 两种写法的结果差异原因

3.1 位掩码写法:isAdmin & roles == isAdmin

这里的&是按位与运算符,规则是对应位都为1时,结果位才为1。
我们把两个值代入运算:

isAdmin: 00000001
roles:   00100101
按位与结果:00000001 → 等于isAdmin的值

这个写法的作用是只校验roles中对应isAdmin的那一位是否为1,完全忽略其他位的状态,只要这个位是1就返回true,符合位掩码技术的设计目的:用单个数值存储多个独立开关状态,校验时互不干扰。

3.2 全等判断写法:roles == isAdmin

全等判断是要求两个值的所有二进制位完全一致,也就是只有当roles只包含isAdmin这一个权限时才会返回true。而你的roles同时包含三个权限,值为37,isAdmin的值为1,37≠1,所以返回false。

位掩码的优势

这种用单个数值存储多个开关状态的方式,不仅节省存储空间,而且所有校验、修改操作都可以通过位运算完成,执行效率非常高,是权限管理、功能开关等场景的常用实现方案。


内容的提问来源于stack exchange,提问作者Sinoreth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 00:51:02