高质量编程与性能调优 | 青训营笔记

46 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

回顾一下前两天的内容:我们学习了Go的基础语法,它的一些特性比如结构体和结构体方法等,然后实战演练了三个小的案例:猜数游戏、在线词典和Socks5代理。第二天学习了并发编程的原理,Go是如何做依赖管理的,Go的测试机制,然后实战了用Gin框架写一个社区话题页面。

今天主要讲两部分内容:高质量编程性能调优的实战。

一、高质量编程

简介

编写的代码能够达到正确可靠、简洁清晰的目标可称之为高质量代码。

  • 健全性,要考虑到各种边界条件
  • 稳定性,要对可能出现的异常进行处理
  • 可读性,便于阅读和维护

编程原则

每种语言都有不同的语法特性,但是高质量编程的原则是一样的。Go语言开发者之一Dave Cheney认为主要有三点:简单性,即不要有代码冗余;可读性,即代码是给人看的,当然也不要写SHI山那种让人无从下手维护的代码;生产力,团队工作效率很重要。

编码规范

代码格式

建议用gofmt自动格式化代码。

gofmt是go官方提供的工具,能自动格式化Go语言代码为官方统一风格。JetBrains系的IDE Goland可以直接使用CTRL+ALT+L格式化代码。

也可以使用goimports,原理上等于gofmt加上依赖包管理。可以自动增删依赖的包引用,将依赖包按字母序排序并分类。

注释

解释代码作用、解释代码的实现流程、解释代码实现的原因、解释代码什么情况会出错

命名规范

  1. 命名要简洁而非冗长。
  2. 缩略词要全大写,但其位于变量开头且不需要导出时全小写。
  3. 变量距离被使用的地方越远就越需要更多的上下文信息。
  4. function image.png
  5. package image.png

控制流程

避免嵌套,保持正常流程清晰。其次,尽量保持正常代码路径为最小缩进。

错误和异常处理

Go的异常处理机制和Java不同,优先使用errors.New来创建匿名变量直接表示简单错误。有格式化的需求时可以使用fmt.Errorf。错误的Wrap和Unwrap、判定一个错误是否为特定错误使用errors.Is、在错误链上获取特定种类的错误,使用errors.As、不建议在业务代码中使用panic、recover只能在被defer的函数中使用,要注意其生效范围。

二、性能优化

性能优化建议使用BenchMark。因为性能表现需要实际数据衡量,Go语言提供了支持基准性能测试的benchmark工具,这是上节课学习的基准测试学到的知识。 使用以下命令进行基准测试: go test -bench=. -benchmem

image.png

其中,第一个字段BenchmarkFib10是测试函数名,-8表示GOMAXPROCS的值为8。第二个字段表示一共执行了1855870次,也就是b.N的值。第三个字段表示每次执行花费的时间,第四个表示每次执行申请的内存,第五个表示每次执行申请几次内存。

避免常见的性能陷阱可以保证大部分程序的性能。但不要一味的追求性能。要在保证简洁清晰,正确可靠的质量要求下提高程序性能。

性能调优实战有空再填坑。

全文毕。