godi 解析godi是goweb3 框架提供的依赖注入Dependency Injection代码生成工具通过分析 Go 源码中的结构体定义自动生成依赖注入相关的注册和查找代码。核心概念1. DiFactroyDI工厂这是 godi 的核心组件负责解析 Go 源码并生成 DI 代码go// 创建DI工厂 diFactroy : difactroy.NewDiFactroy() // 或通过单例获取 diFactroy : difactroy.FindBeanDiFactroy()2. 生成的代码结构对于每个符合条件的结构体godi 会自动生成如下代码函数名功能示例registerBeanXXX()注册 Bean 到 DI 容器registerBeanCmdGodi()FindBeanXXX()从容器查找 BeanFindBeanCmdGodi()LoadXXX()创建并注入依赖LoadCmdGodi()InjectXXX()执行依赖注入InjectCmdGodi()生成示例cmd_godi_init.gogovar singleNameCmdGodi *godicmd.CmdGodi-c18eab54-63a7-4f02-b677-f8b82fcf459a func registerBeanCmdGodi() { _ basedi.RegisterLoadBean(singleNameCmdGodi, LoadCmdGodi) } func FindBeanCmdGodi() *CmdGodi { if bean, ok : basedi.FindBeanOk(singleNameCmdGodi); ok { return bean.(*CmdGodi) } return nil } func LoadCmdGodi() baseiface.ISingleton { var inst NewCmdGodi() InjectCmdGodi(inst) return inst }主要功能方法说明MakeDiAll()扫描所有继承BaseEntity的结构体生成 DI 代码已存在则跳过MakeDiAllForce(true)强制执行覆盖已存在的 DI 代码MakeDiFile(filePath)为指定文件生成 DI 代码MakeDiStru(structName)为指定结构体生成 DI 代码MakeDiCur(dir)为指定目录生成 DI 代码MakeSuite()生成测试套件代码使用方式命令行方式bash# 生成所有DI代码 gowebcli godi all # 强制生成覆盖已有 gowebcli godi forceall # 为指定文件生成 gowebcli godi file ./model/user.go # 为指定结构体生成 gowebcli godi stru UserService # 生成测试套件 gowebcli godi suite UserService代码方式godiFactroy : difactroy.NewDiFactroy() // 生成所有 diFactroy.MakeDiAll() // 强制生成 diFactroy.MakeDiAllForce(true) // 指定文件 diFactroy.MakeDiFile(./dimodel/multi/multi_entity.go) // 指定结构体 diFactroy.Rootdir fileutils.FindRootDir() diFactroy.MakeDiStru(MultiEntity)工作原理源码解析使用 Go AST抽象语法树解析.go文件结构体识别识别继承BaseEntity的结构体代码生成根据模板生成_init.go文件包含注册、查找、加载、注入函数依赖注入运行时通过basedi容器实现依赖注入设计优势减少样板代码自动生成 DI 相关代码统一命名规范通过 UUID 确保 Bean 名称唯一性按需生成支持按文件、按结构体精确生成增量更新默认跳过已存在的代码可通过Force强制覆盖