Golang 代码规范和 linter 实践

1,514 阅读2分钟

这是我参与更文挑战的第17天,活动详情查看:更文挑战

代码规范

为什么需要规范

Java风格的代码:this 还有package的写法

package ConcurrentFuture
type xx struct{
	...
}
func (this *xxx) method(){
	...
}

Go的风格应该是:更加的简洁

package concurrentfuture
type xx struct{
	...
}
func (t *xxx) method(){
	...
}

Go的规范 - 命名

  • package的风格:

    • singleflight。 Go的报名只有小写组成,没有下划线和大写字母,如果要表达的含义太长,Go建议用分层目录。
    • 如果有一个功能为byte类型转化的包,包含都中类型转换方法,报名最好的是:byteconv。原因:包名尽量不使用复数。
  • 变量

    • HTTPRequst、xmlHTTPRquest。对于缩略词一定是要么全大写,要么全小写(例如要么都是xml,要么XML)
    • 一般错误变量以err/Err开头
  • 错误内容

    • errors.New("not enough image data")。错误数据会一直被传递,所以不要有大写和标点符号。但是如果是合理的名词,比如HTTP这种就可以写大写。
    • 日志的打印规则不适用上面说的,因为日志是单独打印的,大小写无所谓,而错误信息往往会和其他东西一起打印。

linter实践

使用linter工具来统一/检查大家的代码风格。

官方的go linter年久失修,常常不是很准确。

常用的go fmt, go vet, go linter

太多了,于是出来一个聚合器golangci-lint.

总结

Q: 为什么golang-lint可以聚合如此多的linters呢?

A: 因为这些linters其实都是同一套解析程序来实现的。在golang/tools/tree/master/go/analysis

补充一点:

go run是怎么认识程序的?go会把代码打散成自己可以理解的片段,这一步叫做tokenize化(比如package main,他会打散成package、main两个词),然后按照语法规则串联起来,这一步叫做parse。形成ast(abstract syntax tree)存起来。

可以参考这篇文章www.01happy.com/golang-ast-…