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

90 阅读2分钟

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

高质量编程

如何编写高质量的Go 代码

代码格式

使用gofmt自动格式化代码(在 goland 中可以设置)

注释

  • 解释代码作用
  • 解释代码过程
  • 解释代码实现原因
  • 解释代码的限制条件、什么情况下会出现错误
  • 公共符号要进行注释,但接口不用注释实现

命名规范

  • 简洁
  • 缩略词全大写,但处于变量开头全小写
  • 使用的距离越远,应携带更多的上下文内容
  • 核心目标降低阅读理解代码的成本

控制流程

  • 去除冗余
  • 最小缩进

错误和异常处理

  • 简单错误不用捕捉
  • 错误判定使用error.ls
  • 在错误链上获取特定的种类错误使用error.As
  • 在业务代码中不是用 panic
  • recover的生效范围只在当前 goroutine中的 defer生效

性能优化

Benchmark

go test -bench=. -benchmen

slice预分配内存

  • 尽可能在make()初始化切片时提供容量信息
  • 使用 copy替代re-slice

map 预分配内存

  • 尽可能在 make()初始化 map 时提供容量信息

字符串处理

  • 使用strings.Builder进行字符串的拼接操作

空结构体

  • 使用空结构体节省内存

atomic 包的使用

  • 使用锁时效率高

性能分析工具

分析工具pprof

首先搭建pprof实践项目

package DbService

import (
	"log"
	"net/http"
	_ "net/http/pprof"
	"os"
	"runtime"
)

func main() {
	log.SetFlags(log.Lshortfile | log.LstdFlags)
	log.SetOutput(os.Stdout)

	runtime.GOMAXPROCS(1)
	runtime.SetMutexProfileFraction(1)
	runtime.SetBlockProfileRate(1)

	go func() {
		if err := http.ListenAndServe(":6060", nil); err != nil {
			log.Fatal(err)
		}
		os.Exit(0)
	}()
}

浏览器输入localhost:6060/debug/pprof/进行查看指标

go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"

调用topN 命令查看占用资源最多的函数

调用 List 命令查看代码行

调用 web 命令使关系可视化

使用下一命令查看 heap 堆内存

go tool pprof "http://localhost:6060/debug/pprof/heap"

使用以下命令查看协程的占用

go tool pprof "http://localhost:6060/debug/pprof/goroutine"

通过以下命令查看锁的详细

go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"

通过以下命令查看阻塞的详细

go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"