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

go 实现用户特权判断的例子的更多相关文章

  1. spring MVC使用Interceptor做用户登录判断

    在任何一个项目中,我们必须要用到的就是用户登录,那么就少不了用户是否登录的判断,如果我们每一个请求都要去做一次判断,那么就会变得很麻烦,但我们复制粘贴的时候我们就要考虑我们的代码写的是不是有问题,是不 ...

  2. Python 操作 mongodb 亿级数据量使用 Bloomfilter 高效率判断唯一性 例子

    工作需要使用 python 处理 mongodb 数据库两亿数据量去重复,需要在大数据量下快速判断数据是否存在 参考资料:https://segmentfault.com/q/101000000061 ...

  3. 基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用

    https://blog.csdn.net/MyCodeDream/article/details/46706469 我们都知道,在很多的网站都提供了给用户提供天气预报的功能,有时会发现,用户即使不输 ...

  4. Django学习路13_创建用户登录,判断数据库中账号名密码是否正确

    在 models.py 中设置数据库表的信息 from django.db import models # Create your models here. class User(models.Mod ...

  5. sql存储过程异常捕获并输出例子还有不输出过程里面判断异常 例子

    编程的异常处理很重要,当然Sql语句中存储过程的异常处理也很重要,明确的异常提示能够快速的找到问题的根源,节省很多时间. 下面,我就以一个插入数据为例来说明Sql Server中的存储过程怎么捕获异常 ...

  6. Python 练习: 简单的用户登录判断

    _user = "klvchen" _passwd = " counter = 0 while counter < 3: username = raw_input( ...

  7. cocos2d JS-(JavaScript) 使用特权方法的例子

    function User(name,age) { var year = (new Date()).getFullYear() - age; this.getYearBorn = function ( ...

  8. vue中使用cookie记住用户上次选择(本次例子中为下拉框)

    最近工作中碰到一个需求,添加一条数据时,自动记住上次选择的下拉框的数据,刚开始觉得没思路,后来请教了项目组长,组长直接一句,这不很简单吧,直接用cookie,我:....... 好吧,都王的差不多了, ...

  9. Request 获取根据页面获取用户输入判断登陆成功或者失败

    import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.serv ...

随机推荐

  1. mysql出现ERROR1698(28000):Access denied for user root@localhost错误解决方法

    我的操作系统是ubuntu18.04,以下是我的mysql版本: 安装完成后,登录mysql的时候就出现了如下错误: 因为安装的过程中没让设置密码,可能密码为空,但无论如何都进不去mysql. 那么该 ...

  2. Django+Xadmin打造在线教育系统(三)

    完成登录 注册 找回密码 激活 验证码集成 将HTML文件拷贝到templates目录下,css,js,img,media,images文件夹拷贝到static文件夹下 修改index.html和lo ...

  3. C# 获取变量或对象的栈与堆地址

    C# 获取变量或对象的栈与堆地址 来源 https://www.cnblogs.com/xiaoyaodijun/p/6605070.html using System; using System.C ...

  4. Nifi flow 备份恢复

      1. 备份  copy 下面的文件到本地: conf/flow.xml.gz   2. 恢复 新安装一个nifi的环境,把这个文件copy到conf文件夹下 运行nifi, 在界面上create ...

  5. 分离式部署LNMP

    -------Nginx----------PHP+NFS------------MySql------192.168.56.202 192.168.56.201 192.168.56.200安装My ...

  6. thinkphp5 上传服务器后 Access denied

    服务器报 Access denied,要么报 No input files,但是在网上查了查说是将 PHP 的cgi.fix_pathinfo 改成 1 即可,但是改成 1 显然是有解析漏洞的,尝试寻 ...

  7. highstock+websocket实现动态展现

    效果:从后台获取回测数据,在前端动态展现,和聚宽实现的回测效果相仿 大体思路:先传一个[[int,0],[int,0],[int,0],[int,0],[int,0],...]格式的死数据到前端渲染x ...

  8. Windows下安装flask虚拟环境

    前提 已经安装好python2.x或者pyhton3.x的条件下,使用pip包管理工具 flask框架就不作介绍直接安装 开始安装 1. 命令窗口下: 进入windows的命令窗口有三种方式: 第一种 ...

  9. vue $emit 用法

    1.父组件可以用props传递给子组件. 2.子组件可以利用$emit触发父组件事件. vm.$emit('父组件方法',参数); vm.$on(event,fn); $on监听event事件后运行f ...

  10. 洛谷P2486 染色

    LCT的一种姿势. 题意:给定一棵树.每次把一条路径上的点染成一种颜色,求一条路径上有多少段颜色. 解: 首先可以很轻易的用树剖解决,只不过代码量让人望而却步... 有一种难以想象的LCT做法... ...