go通过二进制8421码实现权限管理
设置权限
a := a + 2^(n-1)
取消权限
a := a - 2^(n-1)
读取权限
a & 2^(n-1) == 2^(n-1) true 权限存在 false 权限不存在
需求描述
设置审核、添加、发送权限
取消删除权限
以下是demo的全部代码:
package main
import (
"fmt"
"github.com/imroc/biu"
"math"
)
// auth: jocelyn
func main() {
// 设置 右边 -> 左边 1 3 5位置权限
// 取消 2位置权限
// 权限信息
permissionIndex := []struct{
Id int `json:"id"`
Name string `json:"name"`
}{
{
Id: 1,
Name: "审核",
},
{
Id: 2,
Name: "删除",
},
{
Id: 3,
Name: "添加",
},
{
Id: 4,
Name: "修改",
},
{
Id: 5,
Name: "发送",
},
}
// a 10进制权限值
a := uint64(2)
fmt.Println("修改前:\n",biu.ToBinaryString(a))
type info struct {
Id int `json:"id"`
Name string `json:"name"`
Is bool `json:"is"`
}
//var permissionInfo []info
permissionInfo := make([]*info,0)
for i, index := range permissionIndex {
if a & uint64(math.Pow(2,float64(i))) == uint64(math.Pow(2,float64(i))) {
permissionInfo = append(permissionInfo,&info{
Id: index.Id,
Name: index.Name,
Is: true,
})
} else {
permissionInfo = append(permissionInfo,&info{
Id: index.Id,
Name: index.Name,
Is: false,
})
}
}
// 遍历结果 并且设置一个权限demo
for k, i2 := range permissionInfo {
// 模拟前端设置1 3 5 位置权限
if k == 2 || k == 0 || k == 4{
i2.Is = true
}
// 模拟取消设置权限
if k == 1 {
i2.Is = false
}
fmt.Println(i2)
}
// 模拟前端权限数据不匹配
//permissionInfo = append(permissionInfo,&info{
// Id: 6,
// Name: "新加一个权限",
// Is: true,
//})
// 模拟前端提交数组
// 避免前端多传/少传数据
if len(permissionIndex) == len(permissionInfo) {
for _, i2 := range permissionInfo {
if i2.Is {
// 检测原本权限是否存在
if !(a & uint64(math.Pow(2,float64(i2.Id - 1))) == uint64(math.Pow(2,float64(i2.Id - 1)))) {
// 设置新的权限
a = a + uint64(math.Pow(2,float64(i2.Id - 1)))
}
} else {
// 取消权限
if a & uint64(math.Pow(2,float64(i2.Id - 1))) == uint64(math.Pow(2,float64(i2.Id - 1))) {
// 设置新的权限
a = a - uint64(math.Pow(2,float64(i2.Id - 1)))
}
}
}
} else {
fmt.Println("权限类型不匹配")
}
fmt.Println("修改后:\n",biu.ToBinaryString(a))
}