命名规范
统一命名与结构
命名规范的目标是让每个子包一眼能看懂:核心对象是什么、如何独立使用、如何通过 Provider 接入、如何注册驱动和实例。
驱动统一怎么命名
统一使用裸接口名:
type Driver interface { ... }
驱动工厂统一叫 Driver(...):
redis.Driver(client)
s3.Driver(options...)
选择驱动的选项统一叫 Use(name),避免和 Driver 接口冲突:
cache.RegisterPool("default", cache.Use("redis"))
storage.RegisterDisk("cloud", storage.Use("s3"))
子包文件怎么组织
推荐结构:
cache/
registry.go # Registry + New
provider.go # Provider + ProviderOption
options.go # Option / DriverOption
types.go # Driver / Info / 常量
default.go # Default()
memory.go # 默认驱动
redis/ # 外部依赖驱动,独立 go.mod
Provider 写法保持一致
Provider 应返回 provider.Provider 接口,通常嵌入 provider.Base:
func Provider(options ...ProviderOption) provider.Provider {
item := &providerImpl{}
return item
}
生命周期约定:
Init注册 DI 默认对象Register应用配置、注册命令、注册实例和 route serviceResolve处理延迟挂载Boot启动需要等待应用完成注册的逻辑Shutdown释放资源
Default 只负责从 DI 取默认实例
func Default() *Registry {
return provider.MustInvokeDefault[*Registry]()
}
Default() 只能在应用完成 Freeze 或 Run 后使用。启动前配置对象应走 Provider 选项。
命令名避免冲突
命令使用 pkg:verb:
route:list
queue:work
database:ping
devtools:embed
不要新增裸命令名,避免不同包之间冲突。