目录

[Golang]优雅实现「业务/权限」检查

业务场景

对一些业务进行检查,比如权限检查,审核检查等。

实现思路

  1. 对应权限用“枚举”定义,由于Golang没有枚举,所以用常量和后面的map代替。常量定义如下
1
2
3
4
5
6
7
const (
	PermitZero 	= 0
	PermitOne   = 1
	PermitTwo   = 2
	PermitThree = 3
	...
)
  1. 定义Check方法,每个Check方法参数一致,返回一致。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
type CheckParams struct {
	p1	string
	p2	int64
	p3	Context
	...
}

func CheckZero(p *CheckParams) error {}
func CheckOne(p *CheckParams) error {}
func CheckTwo(p *CheckParams) error {}
func CheckThree(p *CheckParams) error {}
...
  1. 把权限顺序放入列表里,对权限与函数进行map对应
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
var (
	CheckFunc = map[int]func(*CheckParams) error {
		PermitZero: 	CheckZero,
		PermitOne: 		CheckOne,
		PermitTwo: 		CheckTwo,
		PermitThree: 	CheckThree,
		...
	}

	CheckOrder = []int {
		PermitZero 	= 0
		PermitOne   = 1
		PermitTwo   = 2
		PermitThree = 3	
		...
	}
)
  1. 业务逻辑编写,遍历CheckOrder,通过位检查权限中是否需要检查当前项目,调用Check函数检查
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func IsSet(s uint64, b int) uint64 {
	return s & (1 << b)
}

for _, index := range CheckOrder {
	if IsSet(permit, index) != 0 {
		baseRet := CheckFunc[index](params)
		if baseRet != nil {
			log.Error(...)
			return 
		}
	}
}