一个golang三方库的常规内容
当我们多写一些项目之后,会发现一些通用的方法或工具,于是希望把这些工具提取出来,成为一个独立的库。 例如 redis、kafka 等中间件,或者 ID 生成器、goroutine 等工具。
一个好的三方库有一些通用的特点,例如:
- 用户友好,最好开箱即用
- 扩展性强,可自定义
- 文档清晰、齐全
- 有使用例子
- 单测齐全
- 接口稳定
- 支持调试
在 golang 中,有一些通用的方式来保证上述的特点。
- 提供构造方法,完成初始化
- Options 模式,提供自定义修改,提供默认参数
- 提供 readme 文档,用于 github 等平台查看
- 提供 doc.go、代码注释,用于 golang 接口文档查看
- 部分组件可插拔,基于 接口 + 实现 的方式,提供扩展性
- 提供充足的单测
- 核心组件基于接口开发,保证接口稳定性
- 提供 example 目录
- 项目内文件结构清晰,职责分明
- 提供 plugin 或者 hook 模式,增强扩展性
常见的扩展点包括:
- Options 扩展,使用 Options 模式,提供常见的一些 Options 操作
- Logger 使用接口 + 实例化的方式
- 提供 Metrics plugin
- 提供 Tracing plugin
- 提供 多个 Backend (存储类)
以下,分析几个项目的实践方式:
项目 | 初始化 | 扩展性 | 可调试 | 测试齐全 | 文档充足 | 例子 | 扩展点 | 项目结构清晰 | 接口稳定 |
---|---|---|---|---|---|---|---|---|---|
gorm | Config | hook | log 级别 | √ | doc.go + 代码注释 | 无 | options + hook | √ | × |
go-redis | Config/Options | hook | × | √ | 代码注释 | example_test.go | options + hook | √ | √ (universal.Client) |
go-kratos | Config | middleware / 接口化 | - | √ | docs + 代码注释 | 无 | Config + middleware + 接口化 | √ | √ |
groupcache | 组合 | hook / 接口化 | × | √ | 代码注释 | 无 | - | √ | √ |
grpc-go | Options | middleware / 接口化 | log、metrics、管理后台 | √ | docs + 代码注释 + proposal | examples | Options + middleware + 接口化 + 外接组件 | √ | √ |
go-zero | Config | middleware | - | √ | 代码注释 | 无 | Config + middleware | √ | × |
sarama | Config | hook | log 级别 / metrics | √ | 代码注释 | examples | Config + hook | × | √ |
Do not wait for leaders; do it alone, person to person.
— Mother Teresa
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!