![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Golang
文章平均质量分 96
惜暮
这个作者很懒,什么都没留下…
展开
-
Sentinel Go 核心统计结构滑动窗口的深度解析
Sentinel Go 核心模块分析之滑动窗口统计结构设计Sentinel Go 系列文章:Sentinel Go 核心模块分析之底层组件运行pipeline设计Sentinel Go 核心模块分析之滑动窗口统计结构设计Sentinel Go 核心模块分析之流量控制设计Sentinel Go 核心模块分析之熔断降级设计Sentinel Go 核心模块分析之热点参数流控设计Sentinel Go 核心模块分析之动态数据源扩展设计...原创 2021-01-01 18:43:41 · 1736 阅读 · 1 评论 -
深入学习CGO
深入学习CGO快速入门基础知识import "C" 语句`#cgo`语句GO与C的类型转换CGO函数调用CGO内部机制CGO内存模型C++类封装成C APICGO调用在go runtime 层面的处理CGO的静态/动态库封装以及编译链接参数CGO定位内存泄露CGO性能CGO最佳使用场景总结参考文献:很多场景下我们希望在Go中利用好已有的C/C++库,Go语言通过自带的一个叫CGO的工具来支持C语言函数调用。本文主要focus在 Go调用C函数的场景。快速入门CGO 一般面向C 的接口编程,下面给出一原创 2020-08-24 21:55:34 · 5092 阅读 · 3 评论 -
golang sync.Mutex互斥锁的实现原理
golang sync.Mutex互斥锁的实现原理数据结构与状态机Lock(1)正常模式(2) 饥饿模式Unlocksync.Mutex是一个不可重入的排他锁。 这点和Java不同,golang里面的排它锁是不可重入的。当一个 goroutine 获得了这个锁的拥有权后, 其它请求锁的 goroutine 就会阻塞在 Lock 方法的调用上,直到锁被释放。数据结构与状态机sync.Mutex 由两个字段 state 和 sema 组成。其中 state 表示当前互斥锁的状态,而 sema 是用于控制原创 2020-05-23 14:18:30 · 2979 阅读 · 3 评论 -
伪共享与CPU cache line
伪共享与CPU cache line原创 2020-05-21 21:30:46 · 632 阅读 · 0 评论 -
golang sync.Pool在1.14中的优化
golang sync.Pool在1.14中的优化sync.Pool在1.12中实现的原理简述1.14 Pool 数据结构poolChainpoolChain.popHead()poolChain.pushHead()poolChain.popTail()poolDequeue数据结构pack/unpackpoolDequeue.pushHeadpoolDequeue.popHeadpoolDequeue.popTail数据结构总结Pool.PutPool.Getvictim的GC优化总结本文基于gol原创 2020-05-20 16:08:28 · 1628 阅读 · 0 评论 -
位运算之补码
位运算之补码补码理解计算机数值的加法利用补码可以用加法来计算减法位运算在我们开发工作中经常遇到,在一些性能优化的场景经常会出现位运算的场景,比如Java的HashMap里面就是不是通过取余操作而是通过 (n - 1) & hash 来计算key的index的(table array的length是2的n次方)。程序中的整数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在...原创 2020-04-22 19:21:21 · 3886 阅读 · 2 评论 -
Etcdv3 client watcher原理分析
Etcdv3 client watcher原理分析背景etcdv3 client watcher整体架构源码分析背景最近在实现高可用流控防护组件sentinel的golang版本 ,扩展数据源这一块,在golang生态里面是etcd是非常重要的一个角色。需求是这样,每个集成sentinel的app instance会与etcd建立长连接来做动态数据源的更新。由于动态数据源的类型有多个,在Jav...原创 2020-03-28 17:17:07 · 1533 阅读 · 0 评论 -
Java map和golang map的一些点
Java map和golang map的一些点hash函数Javagolang内存存储模型:JavaConcurrentHashMapJDK7的分段锁思想JDK8的红黑树golang背景:Java 1.8.40Golang 1.13.5hash函数Java哈希函数代码如下:static final int hash(Object key) { int h; ...原创 2020-02-11 22:38:14 · 1145 阅读 · 0 评论 -
golang 对象(struct) hash原理
golang 对象hash原理map里面的key的hash是怎么实现的golang里面的对象的hash原理map里面的key的hash是怎么实现的源码:src/runtime/map.gogolang的map是内置关键字,不管是get还是set都需要通过key的hash找到对应的存储实体。具体的hash过程如下代码:type maptype struct { typ _ty...原创 2020-02-04 22:56:36 · 4944 阅读 · 1 评论 -
golang interface 与 反射
golang interface 与 反射golang interface 使用场景golang interface 数据结构golang interface 一些使用场景原理函数参数是 interface 的成本interface{}和带方法的interface的赋值过程动态类型与动态分发是如何实现的,动态分发什么时候进行,并且有什么样的调用成本如何进行类型转换如何进行断言,断言的成本有多高为什...原创 2020-02-01 21:45:28 · 2861 阅读 · 0 评论 -
golang type assertion and unsafe.Pointer 性能对比
type assertion performance类型断言性能对比 unsafe.Pointer原创 2020-01-17 21:41:42 · 1182 阅读 · 0 评论 -
golang atomic.Value实践以及原理
golang atomic.Value实践以及原理数据结构StoreLoad一些总结最近一个项目中某个对象需要持有一个统计对象,并且需要能够原子的更新这个统计对象(并发读写场景下),避免data race。为了避免对象的copy, 肯定是要持有这个统计对象的指针了。 此外,这个统计对象其实是统计的模型,需要能够随时替换成其余的统计实现。所以很自然的选用了 interface{}来保存。type...原创 2020-01-15 23:18:59 · 10996 阅读 · 0 评论 -
golang sync.Map 原理以及性能分析
go sync.Map 原理分析go mapsync.Map数据结构go 并发安全的mapsync.Map适用的适用场景原创 2020-01-12 11:25:29 · 7799 阅读 · 0 评论 -
golang 记一次data race排查过程
golang 记一次data race排查过程原创 2020-01-04 17:48:20 · 3621 阅读 · 0 评论 -
golang unsafe.Pointer使用原则以及 uintptr 隐藏的坑
uintptr GC 非类型安全指针unsafe.Pointer 使用模式reflect.SliceHeader的缺陷原创 2020-01-04 12:14:34 · 5787 阅读 · 6 评论 -
golang data race 竞态条件
golang data race, race condition原创 2019-12-20 00:37:20 · 1950 阅读 · 0 评论 -
golang垃圾回收浅析
GC常见垃圾回收算法引用计数标记清除三色标记算法复制算法分代收集算法golangGC的发展golang GC 三色标记主要流程写屏障三色标记状态的记录扫描与对象元信息GC 的触发gcTriggerHeapgcTriggerTimegcTriggerCycle辅助GCGC Pacer根对象标记队列GC的流程Phase1:标记前准备(STW)Phase2 并发标记Phase3:标记终止(STW)Phase4:并发回收原创 2019-12-09 23:50:36 · 2347 阅读 · 0 评论 -
golang 内存分配深度分析
golang runtime的另外一大主题就是内存分配器,内存分配策略与协程栈、堆、GC等话题息息相关。原创 2019-12-01 21:09:13 · 4057 阅读 · 1 评论 -
golang error处理
golang error处理error 是什么?存在的问题舍弃的try提案社区对于error堆栈解决方案go 1.13 的Error 升级本文主要讲解golang中error的使用以及原理。主要包括以下话题。error是什么error 面临的问题舍弃的try提案社区对于error堆栈解决方案go 1.13 对于error的提升error 是什么?在 golang 中我们使用 e...原创 2019-11-04 21:55:32 · 1364 阅读 · 0 评论 -
golang 逃逸分析与栈、堆分配分析
golang 逃逸分析与栈、堆分配分析Question什么是堆?什么是栈?逃逸分析在什么阶段确立逃逸为什么需要逃逸go怎么确定是否逃逸第一:编译器命令第二:反编译命令查看实际案例1.指针2. 不确定类型总结我们在写 golang 代码时候定义变量,那么一个很常见的问题,申请的变量保存在哪里呢?栈?还是堆?会不会有一些特殊例子?这篇文章我们就来探索下具体的case以及如何做分析。还是从实际使用场...原创 2019-10-31 23:47:47 · 5279 阅读 · 2 评论 -
golang defer性能损耗和实际使用场景
golang defer性能损耗和实际使用场景基准测试defer开销实际场景结论我们常常听到别人说:”defer 在栈退出时执行,会有性能损耗,尽量不要用。“ 前面的博客 defer原理 我们分析了defer延迟调用的底层实现原理 。下面我们就基于那篇原理分析文章,来分析一下 defer 延迟调用的性能损耗。基准测试package mainimport ( "sync" "testi...原创 2019-10-28 00:05:30 · 1909 阅读 · 0 评论 -
golang panic和recover 实现原理
golang panic和recover 实现原理思考1.为什么go 进程会终止2. 为什么不会中止运行3.不设置 defer 行不4. 为什么起个 goroutine 就不行数据结构panic恢复 recover panicpanic 抛出总结:这篇文章是系列文章中的第二篇,系列文章主要包括:golang defer的原理golang panic和recover()函数的原理(包括gol...原创 2019-10-27 22:49:52 · 5160 阅读 · 3 评论 -
golang defer原理
golang defer原理defer的特性1. 延迟调用2. 后进先出3. defer 作用域4. 异常处理这篇文章是系列文章的第一篇,系列文章主要包括:golang defer的原理golang panic和recover()函数的原理(包括golang对于错误处理方式)defer性能损耗的讨论以及最重要的应用场景defer在golang 1.13 上的性能defer的特性首...原创 2019-10-25 00:12:48 · 2010 阅读 · 0 评论 -
Golang的内存对齐
Golang的内存对齐测试demo:内存对齐为什么要关心对齐为什么要做对齐默认对齐系数成员对齐:整体对齐对齐规则分析流程成员对齐整体对齐结果小结巧妙的结构体分析流程成员对齐整体对齐结果总结测试demo:我们先来看一个demo:type Part1 struct { a bool b int32 c int8 d int64 e byte}我们先来看一下Part1里面的各个数据...原创 2019-10-14 22:01:40 · 1976 阅读 · 2 评论 -
golang syscall原理
Golang System call1.入口2.系统调用管理3.runtime 中的 SYSCALL4.用户代码的系统调用和调度交互entersyscall和exitsyscall的pipelineentersyscallexitsyscallentersyscallblock5. 总结这篇文章主要是分析在golang里面用户态进行系统调用时候的一些原理,主要关注点将会放在system call...原创 2019-03-07 16:44:50 · 11948 阅读 · 0 评论 -
TCMalloc : Thread-Caching Malloc 论文翻译
TCMallocMotivationOverviewSmall Object AllocationLarge Object AllocationSpansDeallocation(释放)Central Free Lists for Small ObjectsGarbage Collection of Thread Caches本文主要是对于TCMalloc内存分配论文的学习, 英文论文Thre...原创 2019-02-01 22:31:12 · 1066 阅读 · 0 评论 -
Golang-gopark函数和goready函数原理分析
Golang-gopark函数和goready函数原理分析gopark函数goready函数前面介绍的scheduler和channel里面都与gopark和goready这两个函数紧密相关,但是站在上层可以理解这两个函数的作用,但是出于对源码探索,我们要明白这两个函数不仅仅做了啥,还要知道怎么做的。本文主要内容是从底层源码分析这两个函数原理:gopark函数goready函数go...原创 2019-01-06 15:10:00 · 14885 阅读 · 3 评论 -
Golang-Channel原理解析
本文主要分析golang实现并发基础组件channel的实现原理;主要内容分为几个部分Section1:channel使用实例分析Section2:源码分析Section 源码分析channel接收数据所有执行 chan < ep 接收channel数据的代码,最后都会调用到chan.go里面的 chanrecv函数 。...原创 2019-01-06 00:21:35 · 28974 阅读 · 9 评论 -
Golang-bootstrap分析
这篇博客主要分析golang程序的引导程序启动流程。1. 环境要分析runtime相关内部机制,首先从系统启动开始。首先准备分析环境:golang、OS、gdb2. 引导程序宏观流程在go代码里面,用户逻辑从main.main()开始,那么runtime如何启动?怎么初始化?初始化做了哪些工作呢?这里我们从函数运行的起点开始分析。我们先编写一个最简单的go代码:package m...原创 2018-12-09 01:49:40 · 3496 阅读 · 0 评论 -
Golang-Scheduler原理解析
本文主要分析Golang里面对于协程的调度原理,本文与Golang的memory allocation、channel、garbage collection这三个主题是紧密相关的,本文scheduler作为系列的第一篇文章。文章大体上的思路是这样的:section1:主要图示和文字介绍scheduler的原理;section2:从源码和模型的角度介绍scheduler原理;section...原创 2019-01-16 23:35:47 · 13484 阅读 · 12 评论 -
goroutine pool的简单实现
goroutine pool的简单实现golang web server原理粗糙版本的goroutine pool升级版 goroutine pool这篇文章从go提供的web server的出发,理解go web server的实现方式,提出goroutine pool的重要性,然后自己实现一个简单版本的goroutine poolgolang web server原理我们先来看一个非...原创 2019-05-26 00:22:32 · 1560 阅读 · 0 评论 -
Fasthttp里面 goroutine pool 实现原理
Fasthttp里面 goroutine pool 实现原理应用实例源码分析调用链路分析workerPool 的 start 和 stopworkerPool 的 Serve逻辑架构图这篇文章主要讲解fasthttp 这个http库关于协程池做的优化原理;应用实例fasthttp 是一个非常优秀的web server框架,github上的benchmark号称比官方的net/http快1...原创 2019-05-26 14:26:51 · 2186 阅读 · 0 评论 -
Golang 的 sync.Pool设计思路与原理
sync.Pool设计思路与原理使用实例底层数据结构PutGetRuntime 垃圾回收Hook总结使用实例sync.Pool设计的目的是用来保存和复用临时对象,以减少内存分配,降低CG压力。Pool对外暴露的主要有三个接口:func (p *Pool) Get() interface{}func (p *Pool) Put(x interface{})New func() int...原创 2019-05-29 13:44:49 · 7541 阅读 · 5 评论 -
golang slice实践以及底层实现
slice实践以及底层原理Topic:slice是传值还是传地址slice作为函数入参的各种坑切片的数据结构切片的创建切片的扩容切片的拷贝原创 2019-08-16 00:15:59 · 4202 阅读 · 15 评论 -
golang unsafe实践与原理
golang unsafe指针类型unsafe为什么有 unsafeunsafe实现原理指针类型unsafe为什么有 unsafeunsafe 实现原理unsafe 使用实践获取slice长度获取map长度Offsetof 获取成员偏移量string 和 slice 的零拷贝相互转换总结指针类型关于指针的好处这里就不描述了。golang是一种强类型的语言,gola...原创 2019-09-01 23:30:24 · 1614 阅读 · 3 评论 -
Golang map实践以及实现原理
Map实践以及实现原理实例实例原创 2019-09-17 10:36:24 · 12293 阅读 · 11 评论 -
golang的值接收者和指针接收者的区别
golang的值接收者和指针接收者的区别方法值接收者和指针接收者两者分别在何时使用方法方法能给用户自定义的类型添加新的行为。方法和函数的区别在于方法有一个接收者,给一个函数添加一个接收者,那么它就变成了方法。接收者可以是值接收者,也可以是指针接收者。我们在调用方法的时候,值类型既可以调用值接收者的方法,也可以调用指针接收者的方法;指针类型既可以调用指针接收者的方法,也可以调用值接收者的方法...原创 2019-09-17 23:05:56 · 4304 阅读 · 7 评论 -
go tool 命令
go 编译命令go toolgo buildgo testgo tool(1) go tool compile -S main.go反编译代码为汇编代码go buildgo build 命令用于编译我们指定的源码文件或代码包以及它们的依赖包。(2) go build -gcflags=-m main.go打印出编译器逃逸分析的过程,使用 -m 参数。go testgo test...原创 2019-09-22 17:27:02 · 6864 阅读 · 0 评论 -
golang汇编语言基础
Go汇编语言是一个不可忽视的技术。因为哪怕只懂一点点汇编,也便于更好地理解计算机原理,也更容易理解Go语言中动态栈/接口等高级特性的实现原理。Stacks由于 Go 程序中的 goroutine 数目是不可确定的,并且实际场景可能会有百万级别的 goroutine,runtime 必须使用保守的思路来给 goroutine 分配空间以避免吃掉所有的可用内存。也由于此,每个新的 gorouti...原创 2019-09-22 17:06:19 · 5179 阅读 · 0 评论 -
golang类型转换与类型断言
golang类型转换与断言主要内容:golang语言特点:强类型;原创 2019-09-23 16:47:12 · 638 阅读 · 0 评论