第 63 期 2019-10-17 Go 编码风格阅读与讨论

观看视频

Go 夜读第 63 期 Go 编码风格阅读与讨论

内容简介

本期主要是针对近期 uber-go/guide style 和 go-advices 的解读以及开发者讨论。

内容大纲

  • Go CodeReview Comments
  • Uber-go/style
  • Go-advices

分享地址

2019-10-17 21:00:00 ~ 22:10:00, UTC+8

分享 Slides

进一步阅读的材料

Go CodeReviewComments 翻译

Go 官方的建议已经涉及到非常方面:

  • Gofmt
  • Comment Sentences
  • Contexts
  • Copying
  • Crypto Rand
  • Declaring Empty Slices
  • Doc Comments
  • Don’t Panic
  • Error Strings
  • Examples
  • Goroutine Lifetimes
  • Handle Errors
  • Imports
  • Import Dot
  • In-Band Errors
  • Indent Error Flow
  • Initialisms
  • Interfaces
  • Line Length
  • Mixed Caps
  • Named Result Parameters
  • Naked Returns
  • Package Comments
  • Package Names
  • Pass Values
  • Receiver Names
  • Receiver Type
  • Synchronous Functions
  • Useful Test Failures
  • Variable Names

gofmt

不管你是用什么开发工具,都推荐一定要配置 goimports。

Context

  • Context 应该在函数的第一个参数;
  • 不要将 Context 加到结构体中,而应该加一个 ctx 参数;
  • 不要创建自定义的 Context 类型;
  • Context 是不可变的,所以可以将相同的 ctx 传递给调用共享相同截止日期,取消信号,凭证,父跟踪等;

虽然官方已经说明了,但是也还是有不少公司或者开源项目有自己的设计和实现。

Declaring Empty Slices

var t[]stringt:= []string{} 更好

Imports

应该按系统库、内部库、第三方库分层分隔。

Indent Error Flow

if err != nil {
	// error handling...
	return // or continue, etc.
}
// other code
x, err := f()
if err != nil {
	// error handling...
	return
}
// use x...

Variable Names

  • 局部变量应该越精简越好;
  • 不通用的或者全局变量,应该描述更清楚的命名;

Uber Go 风格指南翻译

上周刚出来,过了2天,就出现大量的翻译文章,也能够看出来 Go 语言虽然官方有 gofmt,以及 go vet 静态代码检测工具,但是也抵挡不住大家对于代码风格的热衷。

也说明大家还希望将代码风格更统一,追求更好的代码。

Go-advices

  • Code
  • Concurrency
  • Performance
  • Modules
  • Build
  • Testing
  • Tools
  • Misc

代码方面

  • var foo time.Durationvar fooMillis int64 更好
  • 检查 defer 中的 error
  • %+v 打印足够详细信息
  • 小心 range
  • map 中读取一个不存在的 key 不会 panic,建议:value, ok := map[“no_key”]
  • 将 defer 移到顶部

Dave Cheney


Q&A 总结

  1. 下划线开头 来声明 全局变量

很少见,也不太适用。

  1. 为什么建议channel尽量不加buffer?

按需分配。

  1. go.uber.org/atomic

库非常好,原子操作很方便。新增多种数据类型。

  1. package_test 比 package 好?

比较清晰,但是也有局限性,测试不了内部逻辑,类似于外部包调用。

  1. go test 指定 -count 可以消除偶然因素导致的不稳定结果。

-count=1 也可以消除 cache。

  1. 有没有认证或授权库的推荐?

github 上搜索即可,一般可以根据 star 数量和活跃情况来评判。
也可以去 godoc.org 搜索,查看 imports 引入数据来评判。
https://github.com/dgrijalva/jwt-go