这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
课程主要内容
主要讲解了写高质量代码的注意事项以及使用pprof进行性能调优的流程。
课程详细内容
高质量代码
含义:代码正确可靠且简洁清晰。
编程的原则:
- 简单性
- 可读性
- 生产力
go语言的编码规范
go语言写代码需要注意代码格式、注释、命名规范、控制流程、异常处理等。这些在go中是有规范的,写代码时要注意遵守。
代码格式
代码格式是后续规范的基础。go中代码格式可以通过gofmt、goimports等进行管理。
注释
Good code has lots of comments, bad code requires lots of comments.
对每一个公共符号(每个公共的变量、常量、函数、结构体)都要添加注释。
这里涉及的要求较多。主要的要求如下:
- 注释要解释代码的作用。比如函数、
- 注释要解释代码如何做的。
- 注释要解释代码在什么条件下会出错。 下面这段注释,分别说明函数的返回值是什么。之后解释了函数代码的特点,最后说明了这个函数对于错误的处理。
// TeeReader returns a Reader that writes to w what it reads from r.
// All reads from r performed through it are matched with
// corresponding writes to w. There is no internal buffering -
// the write must complete before the read completes.
// Any error encountered while writing is reported as a read error.
func TeeReader(r Reader, w Writer) Reader {
return &teeReader{r, w}
}
总之通过注释让代码更加清晰易读。
命名格式
对于变量、函数都有详细的要求,但是都要求命名时简洁。
对变量: 缩写要全部大写。命名时离使用的距离越远,越需要详细地进行命名。但是在,比如说for循环中,变量命名就可以很简洁(因为命名复杂也并没有能够携带更多的信息)
对于函数:
函数名不用再带上包名。当名为a的包中的任意一个函数返回一个A类型时,函数名可以不带类型信息,反之函数名需要加上类型信息,避免混淆。
课上举了一个例子,假设说在http包中有一个函数,func Serve(I net.listener,handler Handler ) error和func ServeHTTP(I net.listener,handler Handler ) error这两种命名,很明显前者更好。
包名: 要求必须用小写字母,且不包含下划线等,且不能与标准库同名,且要求包含一定的上下文信息。 尽量不与常用单词同名,尽量使用单数名词,谨慎的使用缩写。
总之,对命名格式有这些要求,是为了让代码更易读(不过感觉这样要求真到我自己写的时候会很麻烦,我可能会没办法判断要把名字缩减到什么程度算是简洁)
控制流程
类似if-else语句等。 对这类语句的要求是尽量走直线路径,避免嵌套,且缩进应尽量为最小缩进。
错误的处理
对于简单错误和复杂错误有不同的处理方式。 简单错误:在其他地方不需要捕获的错误。对这种错误,直接使用erros.New创建匿名变量来显示。
复杂错误:go中能够让错误一层嵌套一层(这里目前还没看懂)。
性能优化
性能优化指南
主要是讲解了一些常用的性能优化技巧。可以使用benchmark工具进行查看
- 使用slice时尽可能优先分配内存空间,同时记得释放内存空间。
- 使用map时预分配内存。
- 对字符串进行拼接时,优先使用strings.Builder,而不是使用“+”。
- 使用空的结构体而不是指定类型,从而节省内存空间。
- 使用atomic包
性能优化工具以及实例
在这节课里主要讲了pprof的使用。 性能调优的原则:
- 要依靠数据进行优化
- 要定位到影响最大的地方,而不是纠结细枝末节的问题
- 不要过早优化
- 不要过度优化(主要要考虑兼容性等问题)
pprof简介
以给的代码为例,在goland中运行“main.go”后,打开网址http://localhost:6060/debug/pprof就能够查看了。
CPU占用相关信息在windows中可以通过任务管理器查看(大概吧,就是不知道准不准)。具体使用pprof。我是在goland的terminal中直接输入
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=10。
其余命令的介绍
top:
主要是为了查看占用最多的函数。输入后其页面显示:
| 标题 | 含义 |
|---|---|
| flat | 当前函数的执行用时 |
| flat% | 前面一列flat占CPU的比例 |
| sum | 上面每一行flat%的综合 |
| cum | 当前函数+其调用函数的用时 |
| cum% | 前一列cum占CPU的比例 |
| 如果flat和cum的值相等,说明当前行的函数没有调用其他函数,如果flat这一列的值为0,说明该函数只被其他函数调用。 |
list XXX
通过正则表达式,查找名为XXX的函数。
web
可视化调用过程,需要别的库。
性能调优实战
主要学习了使用pprof进行性能调优的流程。
总结
今天主要学习了写go语言代码的一些常用的规范,遵守这些规范来尽可能地写出高质量地代码,有很多需要注意的地方,只能后续通过实践一点点加深印象了。之后学习了pprof这个工具,以及用这个工具进行性能调优地流程。