需求:实现用户特权,可以满足下面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()
}