Go 高质量编程|青训营笔记

60 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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 ) errorfunc ServeHTTP(I net.listener,handler Handler ) error这两种命名,很明显前者更好。

包名: 要求必须用小写字母,且不包含下划线等,且不能与标准库同名,且要求包含一定的上下文信息。 尽量不与常用单词同名,尽量使用单数名词,谨慎的使用缩写。

总之,对命名格式有这些要求,是为了让代码更易读(不过感觉这样要求真到我自己写的时候会很麻烦,我可能会没办法判断要把名字缩减到什么程度算是简洁)

控制流程

类似if-else语句等。 对这类语句的要求是尽量走直线路径,避免嵌套,且缩进应尽量为最小缩进。

错误的处理

对于简单错误和复杂错误有不同的处理方式。 简单错误:在其他地方不需要捕获的错误。对这种错误,直接使用erros.New创建匿名变量来显示。

复杂错误:go中能够让错误一层嵌套一层(这里目前还没看懂)。

性能优化

性能优化指南

主要是讲解了一些常用的性能优化技巧。可以使用benchmark工具进行查看

  1. 使用slice时尽可能优先分配内存空间,同时记得释放内存空间。
  2. 使用map时预分配内存。
  3. 对字符串进行拼接时,优先使用strings.Builder,而不是使用“+”。
  4. 使用空的结构体而不是指定类型,从而节省内存空间。
  5. 使用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这个工具,以及用这个工具进行性能调优地流程。