2019年7月3日
刚开始写这篇文章的时候,目标非常大,想要探索 Go 程序的一生:编码、编译、汇编、链接、运行、退出。它的每一步具体如何进行,力图弄清 Go 程序的这一生。
在这个过程中,我又复习了一遍《程序员的自我修养》。这是一本讲编译、链接的书,非常详细,值得一看!数年前,我第一次看到这本书的书名,就非常喜欢。因为它模仿了周星驰喜剧之王里出现的一本书 ——《演员的自我修养》。心向往之!
在开始本文之前,先推荐一 …...
阅读全文
2019年6月17日
写这篇文章的原因很简单,公司内部的 Golang 社区组织了第一期分享,主讲嘉宾就是我们敬爱的曹大。这个必定是要去听的,只是曹大的讲题非常硬核,所以提前找他要了参考资料,花了 1 个小时提前预习,才不至于在正式分享的时候什么也不懂。当然了,这也是对自己和主讲者的尊重。所有的参考资料都在文章最后一部分,欢迎自行探索。
在我读曹大给我的中英文参考资料时,我发现英文的我能读懂,读中文却很费劲。经过对比, …...
阅读全文
2019年6月12日
Go 语言的 context 包短小精悍,非常适合新手学习。不论是它的源码还是实际使用,都值得投入时间去学习。
这篇文章依然想尝试全面、深入地去研究。文章相比往期而言,整体不长,希望你看完可以有所收获!
什么是 context Go 1.7 标准库引入 context,中文译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。 …...
阅读全文
2019年6月3日
上一篇文章我们详细分析了 map 的底层实现,如果你也跟着阅读了源码,那一定对 unsafe.Pointer 不陌生,map 对 key 进行定位的时候,大量使用。
unsafe.Pointer 位于 unsafe 包,这篇文章,我们来深入研究 unsafe 包。先说明一下,本文没有之前那么长了,你可以比较轻松地读完,这样的时候不是太多。
上次发布文章的时候,包括代码超过 5w 字,后台编辑器的体 …...
阅读全文
2019年5月22日
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。
我要说明的是,这里对 map 的基本用法涉及比较少,我相信可以通过阅读其他入门书籍了解。本文的内容比较深入,但是由于我画了各种图,我相信很容易看懂。
什么是 map 维基百科里这样定义 map:
In computer science, an …...
阅读全文
2019年5月7日
反射和 Interface 息息相关,而 Interface 是我们上一篇文章的内容。在开始正文前,和大家说点题外话。
上一篇关于 Interface 的文章发出后,获得了很多的关注和阅读。比如,登上了 GoCN 的每日新闻第一条:
可能是编辑者觉得这篇文章称不上“深度解密”,把标题给小小地改动了下,哈哈~~
在博客园登上了 48 小时阅读排行榜:
在开发者头条 APP (类似于今日头条,不过内容 …...
阅读全文
2019年4月25日
这次文章依然很长,基本上涵盖了 interface 的方方面面,有例子,有源码分析,有汇编分析,前前后后写了 20 多天。洋洋洒洒,长篇大论,依然有些东西没有涉及到,比如文章里没有写到反射,当然,后面会单独写一篇关于反射的文章,这是后话。
还是希望看你在看完文章后能有所收获,有任何问题或意见建议,欢迎在文章后面留言。
这篇文章的架构比较简单,直接抛出 10 个问题,一一解答。
1. Go 语言与鸭 …...
阅读全文
2019年4月2日
Go 语言的 slice 很好用,不过也有一些坑。slice 是 Go 语言一个很重要的数据结构。网上已经有很多文章写过了,似乎没必要再写。但是每个人看问题的视角不同,写出来的东西自然也不一样。我这篇会从更底层的汇编语言去解读它。而且在我写这篇文章的过程中,发现绝大部分文章都存在一些问题,文章里会讲到,这里先不展开。
我希望本文可以终结这个话题,下次再有人想和你讨论 slice,直接把这篇文章的链 …...
阅读全文
2019年3月20日
上周六晚上,我参加了“Go夜读”活动,这期主要讲Go汇编语言,由滴滴大佬曹春晖大神主讲。活动结束后,我感觉打通了任督二脉。活动从晚上9点到深夜11点多,全程深度参与,大呼过瘾,以至于活动结束之后,久久不能平静。
可以说理解了Go汇编语言,就可以让我们对Go的理解上一个台阶,很多以前模棱的东西,在汇编语言面前都无所遁形了。我在活动上收获了很多,今天我来作一个总结,希望给大家带来启发!
缘起 几周前我 …...
阅读全文
2019年3月13日
Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。
Golang运行时的内存分配算法主要源自 Google 为 C 语言开发的TCMalloc算法,全称Thread-Caching Malloc。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采 …...
阅读全文