需求:实现用户特权,可以满足下面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. hdu-3068(最长回文子串-manacher)

    题意:求一个字符串#include<iostream>#include<algorithm>#include<cstring>using namespace std ...

  2. 【RNN】资源汇总

    wesome Recurrent Neural Networks A curated list of resources dedicated to recurrent neural networks ...

  3. Yahoo Programming Contest 2019 自闭记

    A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...

  4. nginx 重定向 说明

    一.nginx 两个操作系统的安装见以前的随笔(已安装请跳过) linux上搭建nginx windows上搭建nginx 二.Nginx重定向——直接到项目,而非nginx欢迎页 默认ngin修改n ...

  5. requests中 .text 和 .content区别

    import requests url = 'https://www.baidu.com' response = requests.get(url) 1.response.content: 这个是直接 ...

  6. 【BZOJ4331】[JSOI2012]越狱老虎桥(Tarjan)

    [BZOJ4331][JSOI2012]越狱老虎桥(Tarjan) 题面 BZOJ 然而BZOJ是权限题QwQ 洛谷 题解 先求出所有割边,那么显然要割掉一条割边. 如果要加入一条边,那么显然是把若干 ...

  7. luogu5020 [NOIp2018]货币系统 (完全背包)

    我那个新的货币系统,就是把原来的货币系统中能被其他数表示的数删掉 那我就算有多少数能被别的数表示,那肯定是要被比它小的表示 于是排个序做完全背包就好了 但是我太zz不会完全背包,然后写了个bitset ...

  8. [NOI2018]你的名字(后缀自动机+线段树)

    题目描述 小A 被选为了ION2018 的出题人,他精心准备了一道质量十分高的题目,且已经把除了题目命名以外的工作都做好了. 由于ION 已经举办了很多届,所以在题目命名上也是有规定的,ION 命题手 ...

  9. SFTP多文件上传,删除

    公司项目中需要把项目的相关文件上传到服务器的tomcat中,需要在项目中进行以下几步操作: 1.添加项目信息,包括名称,描述,服务器ip,sftp的用户名,密码,端口号等,存在配置,部署,删除等操作 ...

  10. mui侧滑菜单"点击含有mui-action-menu类的控件"无法实现侧滑

    .mui-action-menu 标题栏 菜单按钮 指定href="#id"显示与隐藏侧滑菜单 html: <div class="mui-off-canvas-w ...