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()
    }
    
  • 相关阅读:
    .NET Core开发的iNeuOS物联网平台部署在Ubuntu操作系统,无缝跨平台。助力《2019 中国.NET 开发者峰会》。
    iNeuOS 物联网云操作系统2.0发布,集成设备容器、视图建模、机器学习三大模块
    .Net for Spark 实现 WordCount 应用及调试入坑详解
    实际项目中,看 ECharts 和 HighCharts 渲染性能对比,表面看衣装,本质看内功!!!
    iNeuOS云操作系统,.NET Core全系打造
    《ServerSuperIO Designer IDE使用教程》- 7.增加机器学习算法,通讯采集数据与算法相结合。发布:4.2.5 版本
    《ServerSuperIO Designer IDE使用教程》- 6.增加与阿里云物联网(IOT)对接服务,实现数据交互。发布:v4.2.4 版本
    《ServerSuperIO Designer IDE使用教程》- 5.树形结构管理设备驱动,小版本更新。发布:v4.2.3.1版本
    《ServerSuperIO Designer IDE使用教程》-4.增加台达PLC驱动及使用教程,从0到1的改变。发布:v4.2.3版本
    物联网框架ServerSuperIO.Core(.netcore)跨平台,一套设备驱动通吃嵌入式、上位机、云服务
  • 原文地址:https://www.cnblogs.com/shhnwangjian/p/8176942.html
Copyright © 2011-2022 走看看