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

Go语言编程技巧

Tip #7 作者已删除了本tip