go 实现用户特权判断的例子
需求:实现用户特权,可以满足下面1个或多个条件
- 红名
- 达人
- vip会员
- vip超级会员
- 蓝钻用户
- 红钻用户
1、实现方法一:可以根据数据库字段,每个特权用一个字段,进行判断
缺点:每增加一个特权,要进行表字段扩展,代码修改。
2、实现方法二:用一个字段表示多个特权,这个方式需要用到位操作概念
假设定义一个8位无符号int,它的二进制表示如下,每个位置用0、1表示
红钻 蓝钻 超级vip vip 达人 红名
0 0 0 0 0 0 0 0
程序实现逻辑:
一、设置其中一位为1
用1 左移 n 与目标数做 或操作
二、判断其中一位是否等于1
用1 左移 n 与目标数做 &操作
三、清除其中一位
用1 左移 n 与目标数做 异或操作
package main import ( "fmt" ) /* 需求:实现用户用户特权,可以满足下面1个或多个条件 1. 红名 2. 达人 3. Vip会员 4. vip超级会员 5. 蓝钻用户 6. 红钻用户 实现方法一:可以根据数据库字段,每个特权用一个字段,进行判断 缺点:每增加一个特权,要进行表字段扩展,代码修改 实现方法二:用一个字段表示多个特权,这个方式需要用到位操作概念 假设定义一个8位无符号int,它的二进制表示如下,每个位置用0、1表示 红钻 蓝钻 超级vip vip 达人 红名 0 0 0 0 0 0 0 0 一、设置其中一位为1 用1 左移 n 与目标数做 或操作 二、判断其中一位是否等于1 用1 左移 n 与目标数做 &操作 三、清除其中一位 用1 左移 n 与目标数做 异或操作 代码实现如下: */ const ( HongMing = 1 << 0 DaRen = 1 << 1 Vip = 1 << 2 SuperVip = 1 << 3 LanZhuan = 1 << 4 HongZhuan = 1 << 5 ) type User struct { name string flag uint8 } func set_flag(user User, isSet bool, flag uint8) User { if isSet == true { user.flag = user.flag | flag } else { user.flag = user.flag ^ flag } return user } func is_set_flag(user User, flag uint8) bool { result := user.flag & flag return result == flag } func auth() { var user User user.name = "test01" user.flag = 0 result := is_set_flag(user, HongMing) fmt.Printf("user is hongming:%t\n", result) user = set_flag(user, true, HongMing) result = is_set_flag(user, HongMing) fmt.Printf("user is hongming:%t\n", result) //user = set_flag(user, false, HongMing) //result = is_set_flag(user, HongMing) //fmt.Printf("user is hongming:%t\n", result) fmt.Printf("%v\n", user.flag) result = is_set_flag(user, DaRen) fmt.Printf("user is DaRen:%t\n", result) user = set_flag(user, true, DaRen) result = is_set_flag(user, DaRen) fmt.Printf("user is DaRen:%t\n", result) //user = set_flag(user, false, DaRen) //result = is_set_flag(user, DaRen) //fmt.Printf("user is DaRen:%t\n", result) fmt.Printf("%v\n", user.flag) result = is_set_flag(user, Vip) fmt.Printf("user is Vip:%t\n", result) user = set_flag(user, true, Vip) result = is_set_flag(user, Vip) fmt.Printf("user is Vip:%t\n", result) //user = set_flag(user, false, Vip) //result = is_set_flag(user, Vip) //fmt.Printf("user is Vip:%t\n", result) fmt.Printf("%v\n", user.flag) result = is_set_flag(user, SuperVip) fmt.Printf("user is SuperVip:%t\n", result) user = set_flag(user, true, SuperVip) result = is_set_flag(user, SuperVip) fmt.Printf("user is SuperVip:%t\n", result) //user = set_flag(user, false, SuperVip) //result = is_set_flag(user, SuperVip) //fmt.Printf("user is SuperVip:%t\n", result) fmt.Printf("%v\n", user.flag) result = is_set_flag(user, LanZhuan) fmt.Printf("user is LanZhuan:%t\n", result) user = set_flag(user, true, LanZhuan) result = is_set_flag(user, LanZhuan) fmt.Printf("user is LanZhuan:%t\n", result) //user = set_flag(user, false, LanZhuan) //result = is_set_flag(user, LanZhuan) //fmt.Printf("user is LanZhuan:%t\n", result) fmt.Printf("%v\n", user.flag) result = is_set_flag(user, HongZhuan) fmt.Printf("user is HongZhuan:%t\n", result) user = set_flag(user, true, HongZhuan) result = is_set_flag(user, HongZhuan) fmt.Printf("user is HongZhuan:%t\n", result) //user = set_flag(user, false, HongZhuan) //result = is_set_flag(user, HongZhuan) //fmt.Printf("user is HongZhuan:%t\n", result) fmt.Printf("%v\n", user.flag) } func main() { auth() }