1.
前言
2.
Tip #1 一行代码测量函数的执行时间
3.
Tip #2 多阶段 defer
4.
Tip #3 预分配切片以提高性能
5.
Tip #4 将数组解析为切片
6.
Tip #5 方法链
7.
Tip #6 下划线导入
8.
Tip #7 本tip已删除
9.
Tip #8 错误封装
10.
Tip #9 编译时接口检查
11.
Tip #10 避免裸露参数
12.
Tip #11 数字分隔符
13.
Tip #12 使用 crypto/rand 生成密钥,避免使用 math/rand
14.
Tip #13 使用空切片还是更好的NIL切片
15.
Tip #14 错误信息不要大写或者以标点结尾
16.
Tip #15 什么时候使用空白导入和点导入?
17.
Tip #16 不要通过返回 -1 或者 nil 来表示错误
18.
Tip #17 理解“尽快返回、尽早返回”,避免代码嵌套
19.
Tip #18 在使用者的包中定义接口,而不是提供者的包中定义
20.
Tip #19 除非出于文档说明需要,否则避免使用命名结果
21.
Tip #20 传递值,而不是指针
22.
Tip #21 定义方法时,优先使用指针作为接收器
23.
Tip #22 使用结构体或变长参数简化函数签名
24.
Tip #23 省略 getter 方法的'Get'前缀
25.
Tip #24 避免命名中的重复
26.
Tip #25 在 goroutines 之间进行信号传递时,使用 'chan struct{}' 而不是 'chan bool'
27.
Tip #26 使用空标识符(_)明确忽略值,而不是无声地忽略它们
28.
Tip #27 原地过滤
29.
Tip #28 将多个if-else语句转换为switch
30.
Tip #29 避免使用 context.Background,使你的协程具备承诺性
31.
Tip #30 使用context.WithoutCancel()继续上下文操作
32.
Tip #31 使用跳转标签让break和continue语句更简洁
33.
Tip #32 在上下文取消后使用context.AfterFunc来执行调度函数
34.
Tip #33 尽量...不要使用panic()
35.
Tip #34 以context开头,以options结尾,并且总是用error来关闭
36.
Tip #35 转换字符串时优先使用 strconv 而非 fmt
37.
Tip #36 以下划线(_)作为前缀,命名非导出的全局变量
38.
Tip #37 使用未导出的空结构体作为上下文键
39.
Tip #38 使用 fmt.Errorf 使你的错误信息清晰明了,不要让它们过于赤裸
40.
Tip #39 避免在循环中使用defer,否则可能会导致内存溢出
41.
Tip #40 在使用defer时处理错误以防止静默失败
42.
Tip #41 将你结构体中的字段按从大到小的顺序排列
43.
Tip #42 单点错误处理,降低噪音
44.
Tip #43 优雅关闭你的应用程序
45.
Tip #44 有意地使用Must函数来停止程序
46.
Tip #45 始终管理您协程的生命周期
47.
Tip #46 避免在 switch 语句的 case 中使用 break,除非与标签一起使用
48.
Tip #47 表驱动测试,测试集和并行运行测试
49.
Tip #48 避免使用全局变量,尤其是可变变量
50.
Tip #49:赋予调用者决策权
51.
Tip #50 使结构体不可比较
52.
Tip #51 避免使用init()
53.
Tip #52 针对容器化环境(Kubernetes、Docker等)调整GOMAXPROCS
54.
Tip #53 枚举从1开始用于分类,从0用于默认情况
55.
Tip #54 仅在必要时为客户端定义error(var Err = errors.New)
56.
Tip #55 使用空字段防止结构体无键字面量
57.
Tip #56 简化接口并只要求你真正需要的东西
58.
Tip #57 Go 语言中的标志枚举
59.
Tip #58 将互斥锁放在保护的数据附近
60.
Tip #59 如果不需要使用某个参数,删除它或是显式地忽略它
61.
Tip #60 sync.Once是执行单次操作的最佳方式
62.
Tip #61 使用内置锁的类型(sync.Mutex嵌入)
63.
Tip #62 context.Value不是我们的朋友
64.
Tip #63 避免使用time.Sleep(),它不能被context感知且无法被中断
65.
Tip #64 让main()函数更清晰并且易于测试
66.
Tip #65 使用泛型返回指针
67.
Tip #66 在fmt.Errorf中简化你的错误信息
68.
Tip #67 如何处理长函数签名
69.
Tip #68 使用deadcode工具来找到和删除无用的函数
70.
Tip #69 通过errgrup管理多个goroutine
71.
Tip #70 实现一个感知context的sleep 函数
72.
Tip #71 用泛型让 sync.Pool 类型安全
73.
Tip #72 使用strings.EqualFold进行忽略大小写的字符串比较
74.
Tip #73 用stringer工具给枚举类型实现String()方法
75.
Tip #74 使 time.Duration 清晰易懂
76.
Tip #75 使用singleflight优化多次调用
77.
Tip #76 函数调用的结果回传
78.
Tip #77 带缓冲的 channel 作为信号量来限制 goroutine 执行
79.
Tip #78 非阻塞 channel 发送技巧
80.
Tip #79 如果做了不寻常的事,请说明原因
81.
Tip #80 在其使用位置附近声明变量
82.
Tip #81 在检查一个字符串是否为空时,推荐使用 s != "" 而不是 len(s) == 0
83.
Tip #82 使用 %+v 和 %q 来增强调试输出,而不是使用 %v 和 %s
Light
Rust
Coal
Navy
Ayu
Go语言编程技巧
Tip #5 方法链
原始链接:
Method Chaining
在为一个类型定义接收器方法时,返回其自身值。
这种做法允许你在单个、流畅的处理序列中调用多个方法,即所谓的“方法链”,从而实现代码更简洁、更高效。