在 Go 中,位掩码和按位运算提供了操作二进制数据的有效方法。让我们探索这些操作的工作原理,并澄清您对位掩码的困惑。
位掩码是一种利用特制常量来表示不同角色或权限的技术。在代码片段中,您使用 iota 常量创建了一系列常量,每个常量在特定位置包含一个“1”位。然后使用这些常量使用按位 OR ('|') 构造角色变量:
<code class="go">var roles byte = isAdmin | canSeeFinancials | canSeeEurope</code>
此操作将角色中的 '1' 位设置为与三个角色中的 '1' 位的位置相匹配常数。可视化二进制表示有助于:
isAdmin 00000001 canSeeFinancials 00000100 canSeeEurope 00100000 ------------------------- roles 00100101
您的困惑源于此行中使用的按位 AND ('&') 操作:
<code class="go">fmt.Printf("Is Admin? %v\n", isAdmin & roles == isAdmin)</code>
此操作检查是否在roles 变量中设置了isAdmin。然而,表达式是Admin &仅当 isAdmin 和 Roles 都有“1”位时,roles 返回一个包含“1”位的数字。
在您的情况下,由于 Roles 包含 isAdmin 位,因此 isAdmin & 的结果是角色将等于 isAdmin。这就是表达式计算结果为 true 的原因。
但是,如果您使用不太严格的按位相等 (==),则会将角色的整个二进制表示形式与 isAdmin 进行比较。由于 Roles 包含额外的位,因此它不等于 isAdmin,从而导致 false。
位掩码和按位运算是强大的工具,可让您有效地对二进制数据执行逻辑运算。通过理解位操作背后的概念,您可以在 Go 中编写更健壮、更高效的代码。
以上是Go 中按位运算和屏蔽是如何工作的,为什么'isAdmin & Roles == isAdmin”的计算结果为 True?的详细内容。更多信息请关注PHP中文网其他相关文章!