一个golang三方库的常规内容

当我们多写一些项目之后,会发现一些通用的方法或工具,于是希望把这些工具提取出来,成为一个独立的库。 例如 redis、kafka 等中间件,或者 ID 生成器、goroutine 等工具。

一个好的三方库有一些通用的特点,例如:

  1. 用户友好,最好开箱即用
  2. 扩展性强,可自定义
  3. 文档清晰、齐全
  4. 有使用例子
  5. 单测齐全
  6. 接口稳定
  7. 支持调试

在 golang 中,有一些通用的方式来保证上述的特点。

  1. 提供构造方法,完成初始化
  2. Options 模式,提供自定义修改,提供默认参数
  3. 提供 readme 文档,用于 github 等平台查看
  4. 提供 doc.go、代码注释,用于 golang 接口文档查看
  5. 部分组件可插拔,基于 接口 + 实现 的方式,提供扩展性
  6. 提供充足的单测
  7. 核心组件基于接口开发,保证接口稳定性
  8. 提供 example 目录
  9. 项目内文件结构清晰,职责分明
  10. 提供 plugin 或者 hook 模式,增强扩展性

常见的扩展点包括:

  1. Options 扩展,使用 Options 模式,提供常见的一些 Options 操作
  2. Logger 使用接口 + 实例化的方式
  3. 提供 Metrics plugin
  4. 提供 Tracing plugin
  5. 提供 多个 Backend (存储类)

以下,分析几个项目的实践方式:

项目初始化扩展性可调试测试齐全文档充足例子扩展点项目结构清晰接口稳定
gormConfighooklog 级别doc.go + 代码注释options + hook×
go-redisConfig/Optionshook×代码注释example_test.gooptions + hook√ (universal.Client)
go-kratosConfigmiddleware / 接口化-docs + 代码注释Config + middleware + 接口化
groupcache组合hook / 接口化×代码注释-
grpc-goOptionsmiddleware / 接口化log、metrics、管理后台docs + 代码注释 + proposalexamplesOptions + middleware + 接口化 + 外接组件
go-zeroConfigmiddleware-代码注释Config + middleware×
saramaConfighooklog 级别 / metrics代码注释examplesConfig + hook×

Do not wait for leaders; do it alone, person to person.
Mother Teresa


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!