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