![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
golang源码阅读
文章平均质量分 74
ase2014
这个作者很懒,什么都没留下…
展开
-
golang sql源码学习记录
sql总结golang只实现了框架,用于如何连接数据库,具体的数据库连接的驱动,由各类数据库实现,如postgresql为pg,mysql为mysql,整体实现为driver目录下定义各种接口,接口定义得比较细致,可能一个函数就对应一个接口,sql目录下实现整体框架,DB结构体为整体入口,Open函数会创建DB,使用DB调用各类操作函数接口接口定义在driver目录下driver.Driver,具体驱动实现该接口Open(name string) (Conn, error), 用于新开一个连原创 2022-04-10 16:22:49 · 943 阅读 · 0 评论 -
golang http连接池实现
连接池golang http1.1默认开启连接池在Transport里面实现关闭连接池将DisableKeepAlives设置为true或者将MaxIdleConnsPerHost设置小于0的值func (t *Transport) tryPutIdleConn(pconn *persistConn) error { if t.DisableKeepAlives || t.MaxIdleConnsPerHost < 0 { return errKeepAlivesDis原创 2022-02-26 18:27:56 · 2803 阅读 · 0 评论 -
golang http1.1 超时
涉及的结构体Client、Request、Response、TransportClientTimeout参数,通过context来整体控制超时,Request里面的ctx如果也有超时限制,则谁先超时,就使用哪个,即如果ctx先超时,则使用ctx的,如果timeout先超时,则将ctx重新赋值Requestctx context.Context,在Client的Timeout已经说了...原创 2022-02-26 17:10:20 · 950 阅读 · 0 评论 -
golang http1.1代码实现
涉及结构体Client、Transport、Dailer、Request、ResolverRequestctx context.Context 可以设置超时时间ClientTimeout:整体超时设置,与Request的ctx取较小超时时间TransportTLSHandshakeTimeout:tls握手的超时时间,通过AfterFunc实现,超时后,直接返回tlsHandshakeTimeoutErrorDisableKeepAlives:如果为true,不会有conn连接原创 2022-02-24 23:42:59 · 991 阅读 · 0 评论 -
golang源代码阅读,sync系列-Pool
目录总结问题问题解答使用源码分析结构体Put函数pinpinSlow函数runtime_procPin函数和runtime_procUnpin函数procPinprocUnpinshared,结构体poolDequeue概览结构体pushHead函数popHead函数popTail函数Get函数getSlow函数清理函数poolCleanup注册poolCleanup到触发点poolCleanup函数总结可以缓存变量实例的池子,每个pool存储一种类型的变量实例,支持并发内部存储结构,使用了链表、队原创 2021-05-16 13:27:00 · 354 阅读 · 0 评论 -
golang源代码阅读,sync系列-Cond
目录总结使用例子关键字源码分析结构体创建Cond函数Wait函数Signal函数Broadcast函数总结Cond创建的时候需要传入Locker,一般是Mutex或者RWMutex,调用Wait的时候,需要显示调用Cond的L进行加锁和解锁。调用Wait的goroutine会被挂起,当其它goroutine调用Signal会释放一个被挂起的goroutine。调用Broadcast,会将所有挂起的goroutine释放。不能被复制,否则会panic,Cond的copyChecker就是做这件事情原创 2021-05-10 00:28:34 · 268 阅读 · 4 评论 -
golang源代码阅读,sync系列-Map
目录总结关键字使用源码分析结构体函数分析Store函数Load函数LoadOrStore函数LoadAndDelete函数Delete函数Range函数总结golang的map是不支持并发访问和设置的,否则会panic。在golang的历史中,最开始只有不支持并发的map,但是实际上并发访问map的场景比较多,因此后续golang团队开发了sync.Mapsync.Map使用场景有限,虽然并发访问的map的场景都可以使用它,但是golang团队注释里面说明了它的使用场景如果有具体的类型,建议使用原创 2021-05-09 16:11:44 · 344 阅读 · 0 评论 -
golang源代码阅读,sync系列-Once
文章目录总结使用源码分析结构体Do函数总结Once的作用为只执行函数一次。Once使用的场景并不多。因为初始化单例,一般是利用init函数,init函数也执行一次,但是init函数里面执行的东西建议是非阻塞性的,否则会影响整体程序的加载,且不利于定位问题,如果阻塞了话。阻塞性的可以使用Once,如配置初始化Once执行的函数是没有入参和返回参数的,所以一般会使用闭包的方式,初始化一些参数因为Once的实例,一般是定义为全局变量,这样让某个函数只执行一次跟sync下的Mutex、RWMutex一样原创 2021-05-09 00:13:06 · 313 阅读 · 0 评论 -
golang源代码阅读,sync系列
WaitGroup实现:goroutine集合的管理互斥锁实现: 互斥锁读写互斥锁实现: 读写锁Once实现:待完成Cond实现:待完成Map实现:待完成Pool实现:待完成原创 2021-05-06 22:59:20 · 310 阅读 · 2 评论 -
golang源代码阅读,sync系列-读写互斥锁RWMutex
读写互斥锁原创 2021-05-06 22:50:03 · 286 阅读 · 0 评论 -
golang源代码阅读,sync系列-互斥锁Mutex
Mutex源码阅读使用方法代码注释总结文章目录Mutex源码阅读使用方法代码注释总结原创 2021-05-02 12:12:28 · 323 阅读 · 0 评论 -
go tls源码阅读
tls 代码阅读概览分别从客户端和服务端角度,解决整个握手流程,基于go 1.16版本进行分析重点:三个随机数:client hello随机数、server hello随机数、keyExchange 随机数三个随机数生成后续使用对称算法减的密钥客户端和服务端都是基于Conn进行操作的客户端处理流程概览使用单独goroutine迁移处理tls代码实现,handshake_client.go入口:clientHandshakemakeClientHello:支持版本支持的ciphe原创 2021-04-14 23:25:28 · 410 阅读 · 1 评论 -
sync mutex golang
互斥锁Mutex实现:参考代码分析:https://www.jianshu.com/p/ce1553cc5b4f大致介绍sema 是一个互斥的信号量,初始默认值是 0,用于将 goroutine park 休眠或是唤醒。sema acquire 时如果 sema 大于 0,那么减一返回,否则休眠等待。sema release 将 sema 加一,然后唤醒等待队列的第一个 goroutinesema为非零值Sem acquire Mutex: 大于 0,那么减一返回,否则休眠等待Sem relea原创 2021-03-10 19:23:31 · 112 阅读 · 0 评论 -
channel源代码实现
channel实现方式场景hmap为struct,使用pointer创建channel往channel里面发送数据有缓存无缓存有接收者无接受者从channel里面读取数据有缓存无缓存有数据无数据关闭channeltype hchan struct { dataqsiz uint // size of the circular q...原创 2019-12-08 20:57:54 · 49113 阅读 · 0 评论