如何开始写一个go包
- 确定代码结构
- 命名包
- 组织包
- 包开发思想
- go最佳实践
每一个包都是一个拥有单一责任的简洁的 Go 程序。
1. 确定代码结构
组织方式:按 依赖 + 模块化 划分, 框架代码和业务代码分开, 每一个项目都应该按照固定的组织方式进行实现, 所以确定代码结构至关重要。以下结构是我在项目中使用的结构,自我感觉还不错,供大家参考
├── api
│ ├── grpc
│ ├── http
│ └── thrift
├── cmd
│ └── main.go
├── config
│ └── prd.toml
├── internal
│ ├── app
│ │ └── service
│ │ ├── auth.go
│ │ └── user.go
│ ├── config
│ │ ├── build.go
│ │ ├── config.go
│ │ └── runtime.go
│ └── pkg
│ ├── database
│ │ └── mysql
│ ├── httpclient
│ └── redis
│ └── user.go
├── pkg
│ └── engine
└── vendor
pkg/engine: 平台代码(提供服务启动、http/grpc 挂载、 redis/db 实例、 httpclient 实例接口)
internal/pkg/database/mysql: 业务代码中 mysql 实现
internal/pkg/redis: 业务代码中 redis 实现
internal/pkg/httpclient: 业务代码中 httpclient 实现
internal/app/service: 业务代码逻辑实现
api/http: 业务代码api协议
参考: https://draveness.me/golang-101
2. 命名包
建议: 小写/简短/自解释
参考: https://blog.go-zh.org/package-names
3. 组织包
建议: 使用多文件,根据功能组织代码
参考: http://simonblog.cn/2018/05/04/Style-guideline-for-Go-packages/
4. 包开发思想
4.1 接受 interface 参数,返回 struct
参考链接: https://studygolang.com/articles/12397
4.2 全局变量和顶层函数
使用全局变量可以简化操作,建议能用则用(可能其他gopher不认同,但从我的使用上来说确实简化了操作,如redis句柄、log都使用了全局变量处理)
5. go最佳实践
参考: https://github.com/llitfkitfk/go-best-practice
有疑问加站长微信联系(非本文作者)