# 关于《Go程序优化101》

本书将列出一些Go编程中的一些性能优化技巧和建议。本书中的大多数内容是基于官方标准编译器和运行时的实现而做出的。

生活中，我们常常需要做出一些折衷妥协。编程亦如是。 在编程中，我们常常需要在代码简洁性、可读性、可维护性、开发效率和程序运行效率等指标之间进行折衷。 即使对于其中的一个指标，也常常需要各种折衷权衡。 以程序运行效率为例，我们很可能需要在节省内存、代码运行速度和实现难度等方面进行折衷。

在实际项目中，大多数环节的实现代码其实并不要求达到极高的效率。 这些代码的可读性和可维护性常常更为重要。 本书列出的这些建议只是为确实需要高性能的环节提供一些代码实现建议。 其中的一些建议常常会导致更为繁琐的代码。 另外需要注意的是，其中的某些建议实现可能在某些场景是高效的，但对于另一些场景却未必。 所以请按需采纳这些建议。

本书中的建议包括：

- 如何消耗更少的CPU资源；
- 如何消耗更少的内存；
- 如何减少内存开辟；
- 如何控制内存开辟位置；
- 如何降低垃圾回收压力等。

本书不解释如何使用性能分析工具（比如pprof）。 本书也不深究Go编译器和运行时的实现细节。 本书提供的所有建议和技巧均不使用非类型安全指针和cgo。 本书不讨论算法。 换句话说，本书尽量使用浅显易懂的方式来提供一些优化建议，希望这些建议对日常Go编程有所帮助。

如果没有特别指出，本书的例子代码运行于一台如下配置和环境的笔记本上：

    go version go1.19 linux/amd64
    goos: linux
    goarch: amd64
    cpu: Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz

为了排版整齐，本书中各个基准测试输出中的用例运行次数信息被删除了。

请注意：

- 本书中的一些优化建议对各种平台和CPU型号均适用，另一些可能只适用于某些平台和CPU型号。所以请在你的生产环境同等环境下基准测试使用了这些建议的代码。
- 官方标准编译器和运行时的实现细节可能不时地随着版本的变动而改动，这意味着本书中提供的一些建议可能会在今后的版本中失效。

## 关于本书作者

本书作者为老貘，也就是《Go 101》一书的作者。 老貘正计划完成更多《Go 101》系列丛书。敬请期待。

老貘曾（没准儿以后会重新成）为一个独立游戏开发者（他开发的游戏）。

你的赞赏是Go 101系列丛书不断改进和增容的动力：

## 反馈

欢迎各位在Go 101中文项目 (https://github.com/golang101/golang101) 中的问题列表中提交在本书中发现的各种问题和对这些问题的改正。

欢迎关注本书的微信公众号：Go 101（可在微信中搜索“go 101”或者“golang101”，或者扫描下面的二维码）。

本书的twitter帐号为 @Golang_101 (中文 https://twitter.com/Golang_101) 和 @zigo_101 (英文 https://twitter.com/zigo_101)。