icz*_*cza 7

111iota
role
var roles byte = isAdmin | canSeeFinancials | canSeeEurope
1001role

为了轻松理解这些位,让我们打印二进制表示:

fmt.Printf("isAdmin          %08b\n", isAdmin)
fmt.Printf("canSeeFinancials %08b\n", canSeeFinancials)
fmt.Printf("canSeeEurope     %08b\n", canSeeEurope)
fmt.Printf("-------------------------\n")
fmt.Printf("roles            %08b\n", roles)

这将输出:

isAdmin          00000001
canSeeFinancials 00000100
canSeeEurope     00100000
-------------------------
roles            00100101
roles11
0011

表达方式:

isAdmin & roles
isAdmin11roles1rolesisAdminisAdmin00

再次可视化这些位:

fmt.Printf("roles            %08b\n", roles)
fmt.Printf("isAdmin          %08b\n", isAdmin)
fmt.Printf("-------------------------\n")
fmt.Printf("isAdmin & roles  %08b\n", isAdmin&roles)

输出:

roles            00100101
isAdmin          00000001
-------------------------
isAdmin & roles  00000001

试试Go Playground上的例子。

所以表达式:

isAdmin & roles == isAdmin
truerolesisAdminfalse

无遮罩:

roles == isAdmin
truerolesisAdminisAdminisAdmin