Go tips-笔记: 优化 91-100 mistakes

引言

在大多数情况下,编写可读、清晰的代码比编写经过优化但更复杂、更难理解的代码要好,不要过早的优化。建议遵循软件工程师 Wes Dyer 的这句名言:

Make it correct, make it clear, make it concise, make it fast, in that order.

并不意味着禁止为速度和效率优化应用程序, 了解并掌握这些优化点,以备不时之需;文中给出了常见的优化技术;有些特定于 Go 内存模型,内存分配,GPM调度模型;有些是关于了解硬件有助于写出好的代码(适用于不同语言),其中会有硬件方面的术语,可以结合wiki进行学习;

Go tips-笔记: 测试 82-90 mistakes

引言

测试是项目生命周期的一个重要方面。它提供了无数的好处,例如建立对应用程序的信心、充当代码文档以及使重构更容易。与其他一些语言相比,Go 具有强大的编写测试原语。主要讨论测试过程变得脆弱、效率低下和准确性低的常见错误。这类问题属于工程规范实践,有些case同样适用于其他语言。

Go 中提供 go test 工具来执行测试,可以查看具体的开发文档: https://pkg.go.dev/cmd/go#hdr-Testing_flags 里面介绍了每个模式的具体使用方式,使用好这些测试模式flag,可以更快执行或更好地发现可能错误,进而保证代码质量,工程代码稳定性建设上的重要一环。Go中支持4种测试函数:单测函数,基准压测函数,模糊测试,以及打印输出样例测试。

func TestXxx(t *testing.T) { ... }
func BenchmarkXxx(b *testing.B) { ... }
func FuzzXxx(f *testing.F) { ... }
func ExampleXxx() {
	Println("The output of\\nthis example.")
	// Output: The output of
	// this example.
}

Go tips-笔记: 标准库 75-81 mistakes

引言

从程序中产生的错误中大多是使用姿势的不对,以及没有仔细阅读标准库相关包的开发文档,未查看源码导致,但是没有实践过这些问题,即使熟读文档和源码也可能避免不了。笔记中会以书中的mistake为切入点,结合源码升入分析其背后产生的原因,以及提出解决方案来避免。

Go tips-笔记: 并发实践 61-74 mistakes

引言

这里主要介绍并发实践中遇到的问题,这些问题在golang开源项目中也经常会出现,如果编写并发也会一直伴随在开发当中出现,也有工程实践相关的论文进行统计归纳总结(PS: 用这种方式发个论文还是比较轻松的~):

Understanding Real-World Concurrency Bugs in Go

tips: 作者对golang和rust都有研究,结合相关的代码都可以一起学习下, 语言方面的小细节

A Study of Real-World Data Races in Golang

Go 官方提供race工具来检查并发场景下的数据竞争问题: https://go.dev/doc/articles/race_detector

https://github.com/google/sanitizers/wiki/ThreadSanitizerGoManual

注:Go要使用-race,需启用CGO,依赖sanitizers;一般用于开发测试进行检测

如果想更加深入的了解并发并行,可以一起学习这本书: Is Parallel Programming Hard, And, If So, What Can You Do About It?