Go语言Bitmasking与位运算入门:两种权限判断写法结果差异求解
位掩码(Bitmasking)权限判断逻辑讲解
1. 先明确常量的实际值
你代码中用1 << iota生成的常量,每个对应一个独立的二进制位,具体值如下:
isAdmin= 1 << 0 = 1 → 二进制00000001isHeadquarters= 1 << 1 = 2 → 二进制00000010canSeeFinancials= 1 << 2 =4 → 二进制00000100canSeeAfrica= 1 << 3 =8 → 二进制00001000canSeeAsia= 1 <<4 =16 → 二进制00010000canSeeEurope= 1 <<5 =32 → 二进制00100000canSeeNorthAmerica=1 <<6 =64 → 二进制01000000canSeeSouthAmerica=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
相关产品推荐
相关产品推荐

