【go专栏】从原理解析go语言
文章平均质量分 95
记录学习go原理一系列专栏,解析go语言工程师的汇编代码到应用层的编译过程;剖析go底层数据结构;最终通过所学知识打造一个应用层中间件。
_刘小雨
一枚普通而~~~
展开
-
go底层TCP网络编程剖析
我们都知道以太网层和IP 层是不可靠的,想要可靠的传输就必须到传输层。而传输层的重要协议就是TCP 协议了如果我们想要在应用层上开发,也需要在基于TCP 层上开发,所以我们需要了解Go官方是如何去实现传输层的TCP 经典的三次握手和四次挥手过程,我们这节主要讲解go 的相关知识,这里的细节就不一一展开了我们可以想象如果手动实现TCP 的三次握手和四次挥手会怎么样? 答案是很麻烦的, 于是在计算机中就有了socket 这个概念, 它能将三次握手和四次挥手简化几个函数connect(), close(), 屏蔽原创 2022-06-29 16:48:19 · 4224 阅读 · 9 评论 -
go 字符串与切片数据结构底层分析
文章目录1. 字符串切片1.1 查看字符串大小1.2 len 中表示的什么长度?1.3 go中字符编码问题(变长编码)1.4 Unicode 字符集1.5 utf-8变长编码1.6 字符串存储图画表示2. 字符串访问与切分2.1 下标访问2.2 range 访问,正确2.3 go 底层如何判断汉字占3字节,英文占1字节?2.4 字符串的切分3. slice 数据结构3.1 切片的本质3.2 切片的创建3.3 汇编分析3.4 分析代码3.5 切片的访问3.6 切片的追加3.7 解释并发不安全现象1. 字符串原创 2022-05-27 11:26:49 · 1240 阅读 · 0 评论 -
go 语言hello world 的编译过程
文章目录1. 比较各种语言1.1 c/c++1.2 java1.3 js1.4 go2. go 中的runtime2.1 位置2.2 区别2.3 runtime 特点2.4 runtime 能力2.4 runtime other能力3. hello world 编译过程3.1 编译code步骤分析3.2 编译code过程原理3.3 词法分析3.4 句法分析3.5 语义分析3.6 中间码(SSA)3.7 机器码生成3.8 链接3.9 编译过程总结1. 比较各种语言1.1 c/c++c语言不是面向对象原创 2022-05-24 22:06:52 · 1202 阅读 · 0 评论 -
go语言中的锁底层分析(二)
先加mutex 写锁, 若已经被加写锁会阻塞等待将readerCount 变为负值,阻塞读锁的获取计算需要等待多少个读协程释放如果需要等待读协程释放,陷入writerSem (写协程队列等待)【注】:代码在RWMutex 中Lock函数将readerCount 变为正值, 允许读锁的获取释放在readerSem 中等待的读协程解锁mutex将给readerCount 无脑加1如果readerCount 是正数, 加锁成功。......原创 2022-08-11 20:45:00 · 897 阅读 · 9 评论 -
go语言中的锁底层分析(一)
go 中的锁的底层理解是比较复杂的,但在go很多数据结构中都使用到了锁。如果深入了解并知道go 底层的锁是如何实现,不同的锁有啥区别,对于后面在项目中也很有帮助。这一章节主要讲解一下四种锁sync.Mutex : 互斥锁sync.RWMutex : 读写锁sync.WaitGroup : 等待锁sync.Once : 初始化。......原创 2022-08-11 16:09:36 · 1892 阅读 · 8 评论 -
Go语言的其他高级特性
因为cgo 需要用到gcc,而gcc 在windows平台上支持不是很好,这里直接在linux 平台演示假设在go中加一个c代码的注释,图中的假如在项目中有一个很复杂的c代码,在go中不好复现,现在需要用go去调用它在goland中出现下图这样的颜色说明调用就正确了 (用命令看cgo底层做了什么)运行上面命令之后就生成了一个obj文件夹在 文件中,是这样的代码 文件中通过上面两个文件,根据函数可知,跳转到文件中在上面就是c代码,在c中申请了两个入参,一个出参, 上面的代码就是用的原创 2022-08-07 02:03:16 · 2578 阅读 · 10 评论 -
go的堆内存结构分析
操作系统给应用提供的虚拟内存空间(在老的linux32位机器上,操作系统给每个进程一个4GB的虚拟空间),因为操作系统不允许进程动物理内存的,因为物理内存是多个进程共用的(动了别人的内存,那么其他进程可能就崩溃了),所以说操作系统给每个进程提供的是虚拟内存,然后操作系统管理虚拟内存到物理内存之间的关系。需要扫描和不需要扫描上面虚线部分,不是真正的内存,只是一个索引,它把下面的heapArena开辟的内存一组一组索引起来,简单来说它就是下面heapArena的目录。.....................原创 2022-07-29 10:20:50 · 1851 阅读 · 0 评论 -
go协程栈底层讲解
我们之前学习go的协程栈时,有一个程序内部的示意图,也就是下面这个样子。整体区域就是go中的栈区(RAMstack),里面是放go的栈内存的,中间的小块是放go一个协程的协程栈,我们之前学到,一个协程栈的第一个方法是。2.通过runtime.main进入用户的main,这里的main.main需要开多大,是由编译器分析的。协程栈不够大怎么办?,它是为了退出之后重新进行调度用户方法的,后面的就是用户的一个一个方法了。分段栈的情况是假如第一个栈帧空间不够,直接使用图中箭头指向的空间。..............原创 2022-07-29 10:04:32 · 2397 阅读 · 0 评论 -
高级语言垃圾回收思路和如何减少性能影响原理分析
协程栈记录了协程的执行现场Go协程栈位于Go堆内存上Go使用参数拷贝传递3种特殊情况下,变量可能会逃逸到堆上1.14以后,Go使用连续栈,伸缩时直接使用新栈。原创 2022-07-29 20:14:43 · 3135 阅读 · 0 评论 -
go高并发数据结构---channel
代码演示:说明:修改,添加协程1.4 内存与通信在go官方有这样一个建议:怎么理解呢, 我分别给出两个例子就可以了解了共享内存方案: i的地址给另一个协程, 典型的共享内存需要一直遍历, 消耗系统资源通信方式: 不需要一直遍历, 提高系统使用资源总共需要三个成员需要一个缓存buffer发送数据满之后,发送会阻塞,这时会有一个等待队列合并起来,chan 设计需要3个重要的成员hchan 数据结构就是go官方实现的chan 底层设计其中下面几个成员组成了一个缓存区环形缓存下面两个成员组原创 2022-06-30 17:50:21 · 2939 阅读 · 0 评论 -
go语言中hashmap底层分析
通常在学习hashmap 数据结构,会遇到两种方法实现,分别是开放寻址法和拉链法。下面介绍一个这两种方法的区别。拉链法的几个专有名词在中,如图:通过命令,汇编分析汇编代码通过汇编能发现map调用的是runtime/map.go 包下的makemap 方法上述方法结构示意图如下:3.2 通过字面量初始化3.2.1 元素小于25个时,内部转化为简单赋值1) code2)汇编代码底层其实是这样子的3.2.2 元素多于25个,转换为循环赋值1)code2)实际上原创 2022-06-02 11:24:20 · 1492 阅读 · 0 评论 -
go 底层原理及基本概念
1. go底层运行过程不会有人还以为程序运行的入门是main 函数吧。其实很多语言在main函数之前就已经做过很多事情了,下面咋们就分析分析go中的入门到执行的整个过程吧~~~1.1 真正的入口实际上是runtime/rt0_xxx.s 这个文件中, 有关runtime的叙述在上一节已经加以说明...原创 2022-05-25 11:29:22 · 2524 阅读 · 4 评论