2 minutes
Golang Project
这篇是关于项目结构的思考.
1. 项目结构
常见的项目约定是: https://github.com/golang-standards/project-layout 因为是操作 rpc, 所以我更倾向于下面:
.
├── LICENSE.md
├── Makefile
├── README.md
├── build
│ ├── README.md
│ └── ci
├── cmd
│ ├── README.md
│ └── _your_app_
├── deployments
│ └── README.md
├── docs
│ └── README.md
├── examples
│ └── README.md
├── githooks
│ └── README.md
├── internal
│ ├── README.md
│ ├── app
│ │ └── _your_app_
│ └── pkg
│ └── _your_private_lib_
├── pkg
│ ├── README.md
│ └── _your_public_lib_
├── scripts
│ └── README.md
├── test
│ └── README.md
├── tools
│ └── README.md
└── vendor
└── README.md
虽然 go mod支持 proxy模式, 并且vendor只是个过渡兼容方案(意味着以后可能就没有vendor了), 个人还是建议vendor还是得保留下, 万一以后 proxy服务不可用, 那么, vendor打包方式就可以救命了(尤其是紧急fix的时候, proxy还不可用)
2. 注释
官方的参考: https://blog.golang.org/godoc-documenting-go-code 总结下来, 就是下面几个模板.
- project doc
// Package sort provides primitives for sorting slices and user-defined
// collections.
package sort
- func/struct doc
// Fprint formats using the default formats for its operands and writes to w.
// Spaces are added between operands when neither is a string.
// It returns the number of bytes written and any write error encountered.
func Fprint(w io.Writer, a ...interface{}) (n int, err error) {
- bug doc
// BUG(r): The rule Title uses for word boundaries does not handle Unicode punctuation properly.
竞态检查
线上代码尽量先本地build, build的同时, 进行一次竞态检查 参考: https://blog.golang.org/race-detector 常用命令: go build -race xxx
代码风格
代码整洁
channel & pipeline
pipeline: 多个channel串联实现任务处理, 官方blog
tools
go generate: 生成代码, 释放手工.
序列化方式
官方: go gob 鸟窝的测试: https://colobu.com/2015/09/28/Golang-Serializer-Benchmark-Comparison/ msp、gogoproto 是常用的两个, 并且性能很好. 在序列化到 redis中的时候, 经常使用 msgp.
gitlab hook
https://blog.golang.org/go-fmt-your-code
诊断
pprof: https://blog.golang.org/profiling-go-programs
code review
https://github.com/golang/go/wiki/CodeReviewComments
ci/cd
- gitlab ci
- golang-ci 相对而言, golang-ci 用的比较多
开源
https://github.com/goreleaser/goreleaser 将项目推送到 brew 官方仓库
258 Words
2019-06-02 22:59 +0800