zoukankan      html  css  js  c++  java
  • 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
    ", result)
    
    	user = set_flag(user, true, HongMing)
    	result = is_set_flag(user, HongMing)
    	fmt.Printf("user is hongming:%t
    ", result)
    
    	//user = set_flag(user, false, HongMing)
    	//result = is_set_flag(user, HongMing)
    	//fmt.Printf("user is hongming:%t
    ", result)
    
    	fmt.Printf("%v
    ", user.flag)
    
    	result = is_set_flag(user, DaRen)
    	fmt.Printf("user is DaRen:%t
    ", result)
    
    	user = set_flag(user, true, DaRen)
    	result = is_set_flag(user, DaRen)
    	fmt.Printf("user is DaRen:%t
    ", result)
    
    	//user = set_flag(user, false, DaRen)
    	//result = is_set_flag(user, DaRen)
    	//fmt.Printf("user is DaRen:%t
    ", result)
    
    	fmt.Printf("%v
    ", user.flag)
    
    	result = is_set_flag(user, Vip)
    	fmt.Printf("user is Vip:%t
    ", result)
    
    	user = set_flag(user, true, Vip)
    	result = is_set_flag(user, Vip)
    	fmt.Printf("user is Vip:%t
    ", result)
    
    	//user = set_flag(user, false, Vip)
    	//result = is_set_flag(user, Vip)
    	//fmt.Printf("user is Vip:%t
    ", result)
    
    	fmt.Printf("%v
    ", user.flag)
    
    	result = is_set_flag(user, SuperVip)
    	fmt.Printf("user is SuperVip:%t
    ", result)
    
    	user = set_flag(user, true, SuperVip)
    	result = is_set_flag(user, SuperVip)
    	fmt.Printf("user is SuperVip:%t
    ", result)
    
    	//user = set_flag(user, false, SuperVip)
    	//result = is_set_flag(user, SuperVip)
    	//fmt.Printf("user is SuperVip:%t
    ", result)
    
    	fmt.Printf("%v
    ", user.flag)
    
    	result = is_set_flag(user, LanZhuan)
    	fmt.Printf("user is LanZhuan:%t
    ", result)
    
    	user = set_flag(user, true, LanZhuan)
    	result = is_set_flag(user, LanZhuan)
    	fmt.Printf("user is LanZhuan:%t
    ", result)
    
    	//user = set_flag(user, false, LanZhuan)
    	//result = is_set_flag(user, LanZhuan)
    	//fmt.Printf("user is LanZhuan:%t
    ", result)
    
    	fmt.Printf("%v
    ", user.flag)
    
    	result = is_set_flag(user, HongZhuan)
    	fmt.Printf("user is HongZhuan:%t
    ", result)
    
    	user = set_flag(user, true, HongZhuan)
    	result = is_set_flag(user, HongZhuan)
    	fmt.Printf("user is HongZhuan:%t
    ", result)
    
    	//user = set_flag(user, false, HongZhuan)
    	//result = is_set_flag(user, HongZhuan)
    	//fmt.Printf("user is HongZhuan:%t
    ", result)
    
    	fmt.Printf("%v
    ", user.flag)
    
    }
    
    func main() {
    	auth()
    }
    
  • 相关阅读:
    PHP垃圾回收深入理解
    PHP的运行机制与原理(底层)
    SSO单点登录-简单实现
    HBuilder 打包流程
    PHP实现多继承的效果(tarits)
    mysql explain用法和结果的含义
    mysql分区功能详细介绍,以及实例
    MySQL分表、分区

    椒图
  • 原文地址:https://www.cnblogs.com/shhnwangjian/p/8176942.html
Copyright © 2011-2022 走看看