深入Go的底层,带你走近一群有追求的人
上周六晚上,我参加了“Go夜读”活动,这期主要讲Go汇编语言,由滴滴大佬曹春晖大神主讲。活动结束后,我感觉打通了任督二脉。活动从晚上9点到深夜11点多,全程深度参与,大呼过瘾,以至于活动结束之后,久久不能平静。
可以说理解了Go汇编语言,就可以让我们对Go的理解上一个台阶,很多以前模棱的东西,在汇编语言面前都无所遁形了。我在活动上收获了很多,今天我来作一个总结,希望给大家带来启!
缘起
几周前我写了一篇关于defer
的文章:《Golang之如何轻松化解defer的温柔陷阱》。这篇文章发出后不久就被GoCN
的每日新闻收录了,然后就被Go夜读群的大佬杨文看到了,之后被邀请去夜读活动分享。
正式分享前,我又主题阅读了很多文章,以求把defer讲清楚。阅读过程中,我发现但凡深入一点的文章,都会抛出Go汇编语言。于是就去搜索资料,无奈相关的资料太少,看得云里雾里,后到了真正要分享的时候也没有完全弄清楚。
夜读活动结束之后,杨发布了由春晖大神带来的夜读分享预告:《plan9 汇编入门,带你打通应用和底层》
。我得知这个消息后,非常激动!终于有牛人可以讲讲Go汇编语言了,听完之后估计会有很大提升,也能搞懂defer的底层原理了!
接着,我发现,春晖大神竟然和我在同一个公司!我在公司内网上搜到了他写的plan9汇编相关文章,发布到Go夜读的github上。我提前花时间预习完了文章,整理出了遇到的问题。
周六晚上9点准时开讲,曹大的准备很充分!原来1个小时的时间被拉长到了2个多小时,而曹大精力和反应一直很迅速,问的问题很快就能得到回答。我全程和曹大直接对话,感觉简直不要太爽!
这篇文章既是对这次夜读的总结,也是为了宣传一下Go夜读活动。那里是一群有追求的人,他们每周都会聚在一起,通过网络,探讨Go语言的方方面面。我相信,参与的人都会有很多不同的收获。
我直接参与的Go夜读活动有三期,一期分享,两期听讲,每次都有很多的收获。
自我介绍的技巧
很多人都不知道怎么做好一个自我介绍,要么含糊其辞,介绍完大家都不知道你讲了什么;要么说了半天的信息,大家并不关心的事情,搞得很尴尬。 其实自我介绍没那么难,掌握套路后,是可以做得很好的!
我在上上期Go夜读分享的时候,用一张PPT完成了自我介绍。包含了四个方面:个人基本信息
、出现在此时此地的原因
、我能带来的帮助
、我希望得到的帮助
。
个人基本信息
包括你叫什么名字,是哪里人,在什么地方工作,毕业于哪个学校,有什么兴趣爱好……这些基本的属性。这些信息可以让大家快速形成对你的直观认识。
出现在此时此地的原因
,可以讲解你的故事。你在什么地方通过什么人知道了这个活动,然后因为什么打动你来参加……通过故事可以迅速拉近与现场其他参与者的距离。
我能带来的帮助
,参加活动的人都是想获取一些东西的:知识、经验、见闻等等。但是,我们不能只索取,不付出。因此,可以讲讲你可以提供的帮助。比如我可以联系场地,我会写宣传文章等等,你可以讲出你独特的价值。
我希望得到的帮助
。每个参与的人都希望从活动中获得自己想要的东西,正是因为此,这个活动对于参与者才有意义,也才会持续下去的动力。
这四个方面,可以组成一个非常精彩的自我介绍。它早是我在听罗胖的《罗辑思维》听到的,我把它写进了我的人生算法
里,今天推荐给大家。希望大家以后在需要自我介绍的场合有话可说,而且能说的精彩。
硬核知识点
什么是plan9汇编
我们知道,CPU是只认二进制指令的,也就是一串的0101;人类无法记住这些二进制码,于是发明了汇编语言。汇编语言实际上是二进制指令的文本形式,它与指令可以一一对应。
每一种CPU指令都是不一样的,因此对应的汇编语言也就不一样。人类写完汇编语言后,把它转换成二进制码,就可以被机器执行了。转换的动作由编译器完成。
Go语言的编译器和汇编器都带了一个-S参数,可以查看生成的终目标代码。通过对比目标代码和原始的Go语言或Go汇编语言代码的差异可以加深对底层实现的理解。
Go汇编语言实际上来源于plan9汇编语言,而plan9汇编语言初来源于Go语言作者之一的Ken Thompson为plan9系统所写的C语言编译器输出的汇编伪代码。这里强烈推荐一下春晖大神的新书《Go语言编程》,即将上市,电子版的点击阅读原文可以看到地址,书中有一整个章节讲Go的汇编语言,非常精彩!
理解Go的汇编语言,哪怕只是一点点,都能对Go的运行机制有更深入的理解。比如我们以前讲的defer,如果从Go源码编译后的汇编代码来看,就能深刻地掌握它的底层原理。再比如,很多文章都会分析Go的函数参数传递都是值传递,如果把汇编代码秀出来,很容易就能得出结论。
汇编角度看函数调用及返回过程
假设我们有一个这样年幼无知的例子,求两个int的和,Go源码如下:
package main
func main() {
_ = add(3,5)
}
func add(a, b int) int {
return a+b
}
相关文章