这篇是关于项目结构的思考.

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 总结下来, 就是下面几个模板.

  1. project doc
// Package sort provides primitives for sorting slices and user-defined
// collections.
package sort
  1. 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) {
  1. 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: 生成代码, 释放手工.

  1. 官方blog, proposal
  2. 生成小助手

序列化方式

官方: 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

  1. gitlab ci
  2. golang-ci 相对而言, golang-ci 用的比较多

开源

https://github.com/goreleaser/goreleaser 将项目推送到 brew 官方仓库