go 工具链 (未完待续)
1. package
- go mod init maocaoying.com/learn
 - go mod tidy
 - go install // install cmd into GOPTAH
 - go get // 感觉废弃了,直接go mod tidy
 
2. go help cmd
// help cmd detail info
3. test
- 
go test [-v] learn_test.go // 指定文件 默认所有testfunc
 - 
go test -v -run TestA select_test.go // TestA func. TestA* 正则匹配的都会执行
 - 
go test -v -bench=. benchmark_test.go
 - 
go test -v -bench=. -benchtime=5s benchmark_test.go
 - 
go test -v -bench=Alloc -benchmem benchmark_test.go 内存分配
 - 
go test -bench=. -run=none 命令得到以下结果
![]()
因为默认情况下 go test 会运行单元测试,为了防止单元测试的输出影响我们查看基准测试的结果,可以使用-run=匹配一个从来没有的单元测试方法,过滤掉单元测试的输出,我们这里使用none,因为我们基本上不会创建这个名字的单元测试方法。 - 
-8 表示运行时对应的 GOMAXPROCS 的值;
 - 
7618 for range times =>b.N
 - 
146356 ns/op 每次操作花费 146356ns
 
并行用法
func BenchmarkSprints(b *testing.B) {
   b.RunParallel(func(pb *testing.PB) {
     for pb.Next() {
       // do something
       fmt.Sprint("代码轶事")
     }
   })
 }
- RunParallel并发的执行benchmark。RunParallel创建p个goroutine然后把b.N个迭代测试分布到这些goroutine上。
 - goroutine的数目默认是GOMAXPROCS。如果要增加non-CPU-bound的benchmark的并个数,在执行RunParallel之前那就使用b.SetParallelism(p int)来设置,最终goroutine个数就等于p * runtime.GOMAXPROCS(0)。
 
  // 重置计时器   在for循环之前用
  b.ResetTimer()
  // 停止计时器
  b.StopTimer()
  // 开始计时器
  b.StartTimer()
4. 调试 优化
- delve https://www.maocaoying.com/topic/971
 - vet
 - 竞态检测器 race
 
 $ go test -race mypkg
$ go run -race mysrc.go
$ go build -race mycmd
$ go install -race mypkg
