这是我参与更文挑战的第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-…