关于go程序对8421码权限管理的demo(二进制表示状态)

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))
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值