
Go底层
文章平均质量分 75
讲解Go底层源码加深理解
在成都搬砖的鸭鸭
这个作者很懒,什么都没留下…
展开
-
【Go底层】singleflight包原理
看singleflight原码之后,要实现一个请求正在执行,相同的其它请求进来时直接报错的功能也很简单,将singleflight中等待第一个请求的逻辑改为直接返回错误就可以。原创 2025-01-09 18:49:32 · 538 阅读 · 0 评论 -
【Go底层】select原理
select虽然使用起来简单,但其实现逻辑还是比较复杂的,通过熟悉其实现,我们能理解对多个通道进行操作时候,可以为每一个通道创建一个协程去操作,这无疑增加了GC开销,但是使用select采用了多路复用的思想,将一个协程绑定在多个协程等待对象上,而且对case使用了随机顺序,确保每一个case都能公平的被执行。原创 2024-12-03 17:08:41 · 1464 阅读 · 0 评论 -
【Go底层】time包中Timer定时器原理
通过看Timer的源码之后,能更好的根据不同的业务场景去使用不同的定时器,对于不满足业务场景的定时器,可以采用工厂模式的方式封装一个自定义的定时器去满足我们的业务使用。原创 2024-12-01 18:21:47 · 846 阅读 · 0 评论 -
【Go底层】time包Ticker定时器原理
通过对Ticker对象中通道的理解,在select中有多个case时,对于准备好的case,select会从中随机选择一个,所以要注意case中如有Ticker的通道对象时,不一定会定时间隔的读取到数据。Ticker对象还提供了一些其它的函数:Stop(停止定时器)、Reset(重置定时器)、Tick(返回只读的时间通道)。原创 2024-11-29 17:57:14 · 1029 阅读 · 0 评论 -
【Go底层】通道原理
通过分析写chan、读chan的源码,我们在写代码时能很容易避免协程阻塞,能很清楚的理解未初始化chan和关闭chan对读写操作的影响。原创 2024-11-28 17:10:51 · 1181 阅读 · 0 评论 -
【Go底层】string和[]byte相互转换原理
字符串和字节数组转换虽然很简单,但是会带来一定的开销,当然并不是就不能使用这种转换方式,最主要还是根据我们的业务场景去使用,大部分业务场景性能要求并不是在这,但是我们也要尽量避免频繁的进行字符串和字节数组的相互转换。原创 2024-11-20 15:00:02 · 799 阅读 · 0 评论 -
【Go底层】切片扩容原理
切片进行扩容时,如果赋值给一个新的切片未进行扩容时,这时新切片和旧切片指向的底层数组是同一个,其中任意一个切片对底层数组的修改都会影响到另一个切片,所以我们根据切片的扩容计算逻辑在不同的业务场景初始化不同的长度和容量,减少多次扩容进行内存分配的开销。原创 2024-11-19 19:51:40 · 468 阅读 · 0 评论 -
【Go底层】+操作符拼接字符串原理
全是字符串常量的拼接是在编译阶段,带字符串变量的拼接是在运行阶段。运行阶段如果拼接字符串的总长小于临时buf(长度为32位),就使用临时buf作为字符串的底层数组使用,如果接字符串的总长大于临时buf,就在堆上申请一块新的空间给字符串使用。原创 2024-11-17 12:04:41 · 492 阅读 · 0 评论