![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
golang源码探究
文章平均质量分 95
go源码分析系列
CoreDump丶
一枚学生党
展开
-
go字符串拼接方式及性能比拼
在golang中字符串的拼接方式有多种,本文将会介绍比较常用的几种方式,并且对各种方式进行压测,以此来得到在不同场景下更适合使用的方案。原创 2023-09-25 17:40:21 · 1723 阅读 · 0 评论 -
Golang源码探究——从Go程序的入口到GMP模型
在大多数的编程语言中,main函数都是用户程序的入口函数,go中也是如此。那么main.main是整个程序的入口吗, 肯定不是,因为go程序依赖于runtime,在程序的初始阶段需要初始化运行时,之后才会运行到用户的main函数,那么main.main是在哪里被调用的呢?接下来就从go程序的入口,再到go的GMP模型进行一个探究。原创 2023-06-29 13:13:43 · 714 阅读 · 2 评论 -
Golang源码探究 —— 网络轮询器netpoller
网络通信是服务端程序必不可少也是至关重要的一部分,基于TCP Socket的通信则是网络编程的主流。TCP Socket是最常见的网络编程,在POSIX标准发布后,Socket得到了各大主流操作系统平台很好的支持。 Go是自带运行时的跨平台编程语言,Go的net包中暴露给开发者的Socket也是建立在操作系统原生socket接口之上的。netpoller是Go语言用来屏蔽各个操作系统底层高效I/O多路复用的网络轮询器,它屏蔽了各个操作系统底层不同而且复杂的I/O多路复用的使用,在上层为我们提原创 2022-10-12 22:10:55 · 1668 阅读 · 0 评论 -
Golang源码探究 —— Slice
Golang中的切片算是在代码中使用频率最高的数据结构了,因此了解切片的底层实现可以让我们对切片的使用可以更加熟练和灵活。go的版本:go version go1.16.8 windows/amd641、切片的数据结构Golang中的切片定义在runtime包下的slice.go中,它在底层为一个结构体:type slice struct { array unsafe.Pointer // 指向数据缓冲区的指针 len int // 当前数据原创 2021-11-13 15:03:03 · 1317 阅读 · 0 评论 -
Golang源码探究 —— map
哈希表的实现方式有多种,比如哈希表、红黑树等。Golang的map底层是用哈希表实现的,在介绍Golang map的实现之前首先介绍一下哈希表的两种实现方式: 开放寻址法,底层是一个数组,每个数组都存放一个键值对,空闲的地方就是没有放键值对的地方。首先看如何插入:key-val首先经过一个哈希函数将key值进行哈希得到一个大的数字,然后将其对数组的长度取模,这样它就落在了数组中的一个位置。如果得到的位置没有被占用,那么就直接存放在对应位置。如果已经被占用了,那么就向后寻找一个槽,直到找到空闲的原创 2022-06-25 14:10:03 · 2662 阅读 · 7 评论 -
Golang源码探究 —— sync.Map
Golang内置的map是不支持并发读写的,它在内部有检测机制,一旦发现并发读写,就会panic。如果需要并发读写map,有三种方案。 。前两者的效率在大部分情况下都不如官方提供的sync.Map。接下来来分析一下sync.Map是如何实现并发读写的。 sync.Map的结构用图表示如下:源码如下: sync.Map结构体中包含了四个字段,其中包含了两个map[interface{}]*entry ,entry中包含了一个unsafe的Pointer,这个指针指向了真正的value值。原创 2022-06-28 17:04:12 · 1203 阅读 · 0 评论 -
Golang源码探究 —— chan
在Golang中,chan是我们常用的数据结构,chan是并发安全的,在使用它的时候我们无需考虑锁的问题。而且chan使用非常方便,chan与goroutine配合,很容易就可以实现一个生产者/消费者模型。了解chan的源码可以让我们了解更多关于chan的实现以及更好的使用。原创 2022-09-08 14:32:41 · 2293 阅读 · 0 评论