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