曹大带我学 Go(9)—— 开始积累自己的工具库
你好,我是小X。
曹大最近开 Go 课程了,小X 正在和曹大学 Go。
这个系列会讲一些从课程中学到的让人醍醐灌顶的东西,拨云见日,带你重新认识 Go。
不知道你有没有这样的经验:看了很多计算机相关的书,觉得自己懂得很多,但是一遇到实际问题,就不会解。
再看身边的老司机,执行几行命令,看了几个指标,就准确地定位问题了。他可能也没看那么多理论,但实战能力确实强,心里一下子就失衡了。
这其中有很多原因,我认为其中有一个比较重要的就是:工具的使用。老司机因为经验多,积累了很多 命令、shell 脚本、代码库……这些东西就像瑞士军刀,关键时刻,直接就可以派上大用场。在线上出问题的时候,云淡风轻地说,这行代码有问题,删掉就可以了。潇洒至极!
今天我就把我最近积累的一些工具,包括一些软件、命令,这些是可以直接用于实战的。希望看完之后,能提升你的战斗力。
效率工具
今天推荐 2 个我日常用得比较多的,提升效率的软件:aText、paste。
aText
aText
是一个输入映射的软件,输入预先设定的字符串,就可以转成设定好的目标字符串。我用 aText 存了很多有用的映射,例如,我把打开博客文章的命令缩写成了 XPosts
:
因为博客文件所在的路径比较长,如果我每次都直接敲出完整路径的话,会很麻烦。有了这个映射后,只用输入 XPosts
就自动变成了我要的文件路径。
还有很多场景可以使用 aText
,尤其是你经常要输入的相同的内容,非常方便。
paste
paste
管理剪贴版的历史,只要是你复制过的内容,它都会保存下来,甚至可以对文本内容进行搜索。
比如可以把开发、排查问题时常用的链接、命令都放到一个 tab 下面,要用的时候,直接快捷键调出,怎一个优雅了得。
命令
这部分挑了一些非常有用的命令出来,大家可以记在笔记里,关键时候直接拿出来用。
查看 cache size
看 Go 源码的时候,经常能看到一些 pad 字段,这个字段主要是用来防止 false sharing
,一般是根据 cache line size 来算 pad 大小的。那么查看这个 size 的大小呢?
getconf LEVEL1_DCACHE_LINESIZE
查看内核版本
有时候会遇到一些和内核版本相关的问题,例如 Go 语言里面的内存归还策略在 Go 1.12 有一个改动,将 MADV_DONTNEED
改成了 MADV_FREE
,导致线上应⽤的 RSS ⼤幅上升。
使用
MADV_FREE
方式,程序内存不会立刻回收,即 RSS 值不会立刻下降,只有当 OS 内存紧缺时才会回收 Go 程序的内存;
而 Go 1.11 以及之前的版本默认采用的是
MADV_DONTNEED
方式,程序 RSS 值下降很快。
因此如果需要使程序内存占用下降很慢的话,可设置环境变量
GODEBUG=madvdontneed=1
。
另外,MADV_FREE
只在 Linux 4.5 及之后的版本才有,所以当你遇到 RSS 一直降不下去的场景时,要想确认是不是这个问题导致的,还得看你的内核版本是啥。那就用这个命令:
uname -a
这个归还内存的策略在 Go 1.16 又改回去了。因此只有在 Go 1.12-Go 1.15 之间,且是 Linux 4.5 及之后的内核版本才会有这个问题。
输出代码行号
有时候需要用 cat
命令输出一段代码,截图发给别人。这时如果需要对着代码行号做一些说明的话,把代码行号一并输出来是非常 nice 的,只需要用这个命令:
cat -n a.go
汇总展示代码构成
当我们想看一个开源项目的代码行数的时候,并且能看到各种类型的语言各占多少的时候,怎么办呢?一个命令搞定:
tokei ./
就问你强不强!
这个用在什么场景呢?太多了,例如你准备看一个稍微简单一点的框架,有几个侯选的:chi, echo, gin……执行一下命令,看看代码行数,选择一个最少的。
后记
工具是很重要的,积累了很多前人的智慧,我们拿来直接用,不需要自己再从零开始。当然,适当地学习原理也是必须的。
我们要记住这些命令,存入自己的工具库,要用的时候直接调出来。它们可以节省我们大脑的内存,把宝贵的资源用在思考真正的问题上,而不是记住这些命令。
而且当我们有了自己的代码码、脚本库、工具库的时候,遇到问题,拿上相应的家伙上场,马上就可以得到很多相关的信息,我们再根据这些信息做决策。
今天就先列这些吧,其实还准备了好几个关于 Go 的,先不放出来。如果这篇比较受欢迎,就下期再写了。
最后,也欢迎在留言区分享你的工具,无论是软件,还是一行命令。我会汇总后再分享给大家,切实有效地提升大家的能力。
好了,这就是今天全部的内容了~ 我是小X,我们下期再见~
欢迎关注曹大的 TechPaper 以及码农桃花源~