整理一下Go的基础环境配置和包管理问题,随后对Go语言的编码规范做一个简要总结。
包管理
Go语言的源码复用是建立在包(package)的基础之上的。src目录下存放所有源码,每一个子目录都是一个代码包,同一目录下的每一个源文件开头第一行必须从属于同一个package。Go语言的入口包叫做main,这个必须有。
通过import完成包的导入,
// 单个导入
import "package"
// 批量导入
import (
"package1"
"package2"
)
注意包的命名不要和自带的或者常用的三方库重名。import后会自动执行init,完成资源的初始化。因此也有了匿名导入,比如:
import (
"database/sql"
_ "github.com/mysql/driver"
)
这里就是对github那个三方包完成了匿名导入。
高质量编程
希望程序要:
- 各种边界条件是否考虑完备
- 异常情况处理,稳定性保证
- 易读易维护
希望程序有如下特点:
- 简单:逻辑简明清晰,修改
- 可读:团队交互与代码维护
- 生产力:保证团队整体工作效率
编码规范方面建议:
- 注释:公共符号始终要注释,但注释不要写废话,要提供额外上下文信息。写明代码作用,怎么做,为什么这么做,何时可能出错。
- 代码格式:可使用gofmt自动格式化代码。
- 命名规范:简洁为好,但要表征充足得到信息,尽量变量名给出很好的信息。
- 控制流程:尽量保持正常代码路径为最小缩进
- 错误和异常处理:优先使用errors.New创建匿名变量来直接表示简单错误,比如
return errors.New("stopped after 10 redirects")。而复杂错误可用Wrap嵌套,生成一个error的跟踪链。 error常用于提供上下文信息链,定位问题,panic用于真正的异常情况,recover与defer中生效,处理异常。 总之,降低阅读理解代码的成本,重点考虑上下文信息,名称尽量简洁清晰
Good naming is like a good joke. If you have to explain it, it's not funny. ---- Dave Cheney