如何使用 dlv 结合 Goland 进行程序 debug 调试
如何使用 dlv 结合 Goland 进行程序 debug 调试相信很多 Golang 的初级玩家不会进行程序的 Debug 定位问题单纯的靠脑子,或者效率很低的不断的添加日志打印,别问我为什么知道的因为我就是这样的,最好最快捷的问题定位方式一定是使用 Debug 打断点调试,这时就引出了本文的主角dlv。
实际上,delve 才是全称,dlv 只是启动命令,如果 VScode,Goland,默认使用的调试器就是基于 delve 的。
安装 dlv参考官方的安装方法,把 dlv 命令安装在 gopath 的 bin 目录下(需要你把go的bin目录添加到$PATH)
123git clone https://github.com/go-delve/delvecd delvego install github.com/go-delve/delve/cmd/dlv
成功安装执行
1dlv version
得到:
123Delve DebuggerVersion: 1.7.1Build: $Id: 3bde2354aafb5a4043fd59838842c4cd4a8b6f0b $
进 ...
Casbin 多租户模型(RABC-dom)正确打开方式
Casbin 多租户模型(RABC-dom)正确打开方式
本文使用多租户模型即 RABC-dom 做了一个项目,旨在为你提供好的多租户模型打开方式,抛砖引玉,共同进步。
这里只是介绍多租户模型(casbin 官网叫域内RABC) 的使用方式,对于不了解casbin 的同志们可以先去官网了解一下,之后我会出几个详解casbin 的文章,最近实在是抽不出时间。写这个文章是因为没看到有相关的使用多租户模型的案例,自己做了一个自测有效的正确的打开方式,欢迎大家来讨论。
为什要使用Casbin不知道大家的项目权限管理都是如何做的,反正我们公司是你写你的我写我的全都耦合在各自的代码里,你一个写法我一个写法,各种表之间的JOIN,看着累,写着累,最重要的是严重影响代码的性能。
我去网上查了一下这个 Casbin 这个权限管理工具,发现很不错,他的思路就是根据你的权限逻辑进行一个规定,再把我们要去限定权限的所有资源都拿出来根据你做的规定排列组合形成一个资源权限组, 在你进行资源访问时,根据你的资源权限组进行匹配,匹配规则也是可以定义的,匹配成功就为权限通过。
可以说是摘出了所有代码中的权限,让权限不 ...
聊聊 SSL/TLS (二)
聊一下 SSL/TLS (二)SSL 如何工作SSL是如何工作的呢:
首先DNS对你的域名进行解析,解析出对应的网址IP这样浏览器就可以根据你的IP访问到资源页面。
访问过程中有一个中间步骤我们叫做SSL握手,这一过程成功后网址信息就被核实,交互信息就被加密。
这也就是TLS两个最重要的目的:交互信息机密(confidentiality),网址身份认证(authentication)
此时有必要提一下SNI
SNI (Server Name Indication)说握手之前提一下 SNI(Server Name Indication)
在客户端和服务端建立 HTTPS 的过程中要先进行 TLS 握手,握手后会将 HTTP 报文使用协商好的密钥加密传输。
在 TLS 握手信息中并没有携带客户端要访问的目标地址。这样会导致一个问题,如果一台服务器有多个虚拟主机,且每个主机的域名不一样,使用了不一样的证书,该和哪台虚拟主机进行通信?
由于技术限制,SSL初期的设计顺应经典的公钥基础设施 PKI(Public Key Infrastructure)设计,PKI 认为一个服务器只为一个域名提供服 ...
聊聊 SSL/TLS (一)
聊一下 SSL/TLS (一)因为自己是目前是做证书这块业务,而且证书这个东东大多数互联网人都要用到,所以觉得有必要把这块东西进行一个总结。
目标是透彻了解 SSL/TLS 的全貌,了解SSL本身的一些漏洞及身份认证中的风险,并且对SSL从颁发到部署整个生命周期管理的最佳实践进行延展。争取看下来能让你对证书有一个全方位的了解
本文为第一篇将介绍 SSL/TLS 的基础知识,原理,以及证书的格式,分类及如何签发等基础概念进行讲解。
SSL/TLS 综述概述SSL(Secure Sockets Layer)安全套接层协议 现在叫TLS(Transport Layer Security)安全传输层协议,是设计来使客户端服务端的交流不被窃听和篡改,用于网络身份认证及通信加密。其实就是使用加密算法使得通信系统双方的通信数据无法被阅读及篡改,同时还能确认身份。
最突出的应用:把它加载在我们的通信协议HTTP上就形成了HTTPS。
我们平时使用的邮件传输通信协议STMP也使用了TLS(RFC 3207)公钥证书来认证通信双方的身份。
历史:SSL:
v1.0 未发布
v2.0(NetScape-19 ...
战俘营经济学
战俘营经济学
每天学点经济学,从不同的角度看世界
经济学其实无处不在,并不需要用完善的市场经济体系作为研究对象。
战俘营里的市场经济 有一个战俘营的故事叫做《战俘营里的经济组织》他就描述了战俘营中的经济现象,作者说战俘营中市场行为是一般都是迅速发展起来的,一开始到的人只是相互关心爱护支持以此得到相互之间需求的东西,但是很快大家就发现仅仅这样是不够的,只有发展起市场才可以公平的获取想要的东东。
作者的原话是,事实上一个战俘物质的享受水平的显著提升,不是依靠自身获取生活必须品的能力,而是通过商品和服务交换得以实现的。这句话中蕴含的道理就是物质的总量哪怕不发生变化,只要人与人之间可以进行交易,幸福就可以无中生有的产生。
战俘营中的市场经济不仅交易平台,公开透明的交易价格,还出现了劳动服务市场,有人开始提供各种个样的服务比如洗衣服,熨衣服,甚至是画像。
今天中国很多不发达地区,贫困地区,我们归咎于政策,物资。其实不是的,战俘营中什么都没有繁荣的市场经济也发展了起来。归根结底还是制度和自由度没有给到。
战俘营里的价格和价格波动 有了市场就有了价格, ...
如何使用 Markdown
是不是写markdown的时候经常想着这么写比较好看但忘了语法是啥,笔者专门把常用语法汇总方便大家当然主要是方便自己查找,还有一些流程图甘特图的高级用法很好用大家可以看看。
标题的书写h1 到 h6 的标题分别是从大到小一个到六个#
h1 标题h2 标题h3 标题h4 标题h5 标题h6 标题几种字体斜体文字
斜体文本
粗体文本
粗体文本
斜体粗体文本
斜体粗体文本
对应语法:
1234567891011*斜体文字*_斜体文本_**粗体文本**__粗体文本__***斜体粗体文本***___斜体粗体文本___
分割线
对应语法:
1234567891011___*************************************___________________
删除线删除这段文本
对应语法:
1~~删除这段文本~~
下划线给这段文本加上下划线
对应语法:
1<u>给这段文本加上下划线</u>
注脚这是一段需要注释的说明[^注释]
对应语法:
1这是一段需要注释的说明[^注释]
无序列表
第一项
第二项
...
go 并发中的锁
go 并发中的锁数据存储模型go 并发中最常见的就是锁,全局锁,读写锁,以及原子操作其实都是为了解决数据竞争的问题,如果不上锁多个 go 程处理同一数据时经常会出现数据错乱,那么你搞清楚为什么会数据错乱了吗?
我一开始的理解是并发时 CPU 被竞争,赋值和读取的操作执行顺序错位导致了数据错乱,其实并不是这么简单。
用户写下的代码,先要编译成汇编代码,也就是各种指令,包括读写内存的指令。CPU 的设计者们,为了榨干 CPU 的性能,无所不用其极,各种手段都用上了,你可能听过不少,像流水线、分支预测等等。其中,为了提高读写内存的效率,会对读写指令进行重新排列,这就是所谓的 内存重排,英文为 MemoryReordering。这一部分说的是 CPU 重排,其实还有编译器重排。编译重拍这里不详解,主要说说内存重排。
我们看一下下面三张图,Thread1 和 Thread2 是并发的两个 goroutine,交叉赋值打印,并发时CPU处理顺序是变化的,但我们假设他是按照(1)(2)(3)(4)的顺序执行的,那么你觉的打印的是什么,Thread1打印的B是0,Thread2打印的A是1。其实并不是 ...
死锁
死锁什么是死锁死锁一般发生在多线程的情况下,因为资源争夺会造成线程之间的相互等待,在没有外力的作用下某些线程会一直等待无法工作。
例如:
线程A在获取资源1的情况下期望获取资源2,线程B在获取资源2的情况下期望获取资源1,这样线程A和B就处于了相互等待的状态。
死锁产生的四个必要条件互斥条件多个线程无法共享同一个资源,线程A持有的资源无法再由线程B获取。
持有并等待条件线程A持有资源1但是又去请求资源2,此时资源2被线程C持有,那么线程A处于持有并等待状态,此时线程B期望获取资源1,B也进入了持有并等待状态。
不可剥夺条件线程A在持有资源1后,资源1不可由线程B抢占。
环路等待条件在发生死锁时必然存在一个线程间的环形等待链。
如:线程A在获取资源1的情况下期望获取资源2,线程B在获取资源2的情况下期望获取资源1,此时形成环路等待。
如何避免死锁其实只要破坏上述条件的一环死锁都不会产生,一般我们使用资源有序分配方法来避免环路等待条件的产生。
上述例子:线程A在获取资源1的情况下期望获取资源2,线程B在获取资源2的情况下期望获取资源1。就不是一个有序使用资源的例子
修改成线程A先尝试获取资 ...
聊聊 MySQL 索引
聊聊 MySQL 索引为什么使用索引不同于redis 和 memorycache 等内存数据库,MySQL 数据库中数据表的数据记录是以存储引擎规定的特定数据格式存储在物理磁盘上的。所以执行 sql 语句最耗时的阶段就是磁盘的 IO 阶段。
有效减少磁盘 IO 阶段的查询时间可使查询效率大幅提升,那么我们如何减少 IO 阶段的查询时间呢?
假设有一张数据表表中的数据条数为N,在不使用索引的情况下查询数据表中的一条记录理论上时间复杂度是O(N),即顺序遍历。那么使用索引是否可以大幅度提升效率?
MySQL中主要的是BTREE索引:
B-Tree 是一种平衡搜索树,它具备以下特性:
平衡性,含有 n 个结点的 B-Tree 的高度为 O(logN) 。它的严格高度可能比红黑树(不严格的平衡二叉树)的高度要小许多,这是因为它的分支因子,也就是表示高度的对数的底数可以非常大。
排序性,结点的排列方式类似于二叉搜索树,可以有序的遍历输出结点。
使用索引查询时每层树高都会进行一次I/O,所以索引大大提高了磁盘IO效率O(logN),如何做到建立有效高效的索引呢?以下是几条建议:
索引建议
在 ...
聊聊go的错误处理
Go语言错误处理方式错误定义方式1. Sentinel errors 在很多包中甚至标准库中都会见到以errors.New() 方法获取一个错误并把它赋值为一个包级别的常量,如io.EOF , 这种特定的错误是API在某些场景下需要返回一个特定的错误interface 即使有更具描述性的错误可以返回。
这样做会使包之间的源代码产生依赖关系,如检查错误是否是io.EOF, 项目必须导入io包。这样做很常见但是如果你的项目中很多包都要导出错误值,那么其他包必须依赖这些错误值才能做特定的错误检查,代码极度耦合。
所以尽量避免出现这样错误处理
2. Error types 把error处理成自定义的Type,这样做可以在error中添加一些上下文信息,以及更多的描述性信息。
12345678910111213type MyError struct{ Msg string File string Line int}func (m *MyError)Error()string{ return fmt.Spr ...











