需求:实现用户特权,可以满足下面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. [洛谷日报第62期]Splay简易教程 (转载)

    本文发布于洛谷日报,特约作者:tiger0132 原地址 分割线下为copy的内容 [洛谷日报第62期]Splay简易教程 洛谷科技 18-10-0223:31 简介 二叉排序树(Binary Sor ...

  2. codeforces570C

    Replacement CodeForces - 570C 话说很久很久以前,孙悟空被压在了山下,很无聊.于是他找了一个只包含小写字母和字符"." 的字符串. 由于他比较无聊,他就 ...

  3. CF558E-A Simple Task-线段树+计数排序

    计数排序的原理,只要知道了有几个数比i小,就可以知道i的位置 这道题只有26个字母,搞26颗线段树,然后区间更新 #include <cstdio> #include <cstrin ...

  4. 前端 -- HTML内容

    HTML介绍 Wed服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen(5 ...

  5. HDU4625 JZPTREE 【树形DP】【第二类斯特林数】

    题目大意: 对1到n求题目中描述的那个式子. 题目分析: 幂不好处理,转化为斯特林数. 根据$ n^k= \sum_ { i=0 }^k S(k,i)×i!×C(n,i) $. 我们可以将问题转化为对 ...

  6. 洛谷P1118数字三角形题解

    题目 这个题我们乍一看会有些熟悉.觉得是可以用DP来做的那个题.但是打眼一看,就会发现不对了.因为那个题是顺推而这个题则是逆推. 这样的话可怎么办呢. 我们可以在草稿纸上推一下,我们随便写个数n. 再 ...

  7. 洛谷P1047校门外的树题解

    题目 此题是一个模拟题,但需要注意的一点就是它的树是从数轴的0开始,所以我们也要从0开始,这样才能实现代码. 代码: #include<iostream> using namespace ...

  8. GCD HDU - 2588

    输入 N 和 M (2<=N<=1000000000, 1<=M<=N), 找出所有满足1<=X<=N 且 gcd(X,N)>=M 的 X 的数量. Inpu ...

  9. swagger如何测试List类型参数

    使用swagger 时,往往会用到类似下面这样的注解 @ApiImplicitParam(name = "id", value = "主键", dataType ...

  10. 【cf789C】Functions again(最大子序列和)

    C.Functions again 题意 给你一个数组a[1..n].有一个函数\(f(l,r)=\sum_{i=l}^{r-1}\left| a[i]-a[i+1]\right| (-1)^{l-i ...