Go 初始化应优先使用显式Setup函数而非init,集中管理顺序与错误;大型项目可用Wire等DI工具解耦;新项目宜用模板脚手架标准化结构。

用 init 函数做轻量级初始化
Go 的 init() 函数天然适合模块级预加载,比如配置解析、日志初始化、数据库连接池预热。它在包导入时自动执行,无需手动调用,避免“忘记初始化”的问题。但注意:多个 init 函数按源文件字典序执行,依赖关系需显式控制;不建议在 init 中做耗时操作(如远程 HTTP 请求),否则会拖慢整个程序启动。
把初始化逻辑封装成可复用的 Setup 函数
比起零散的 init,更推荐定义明确签名的 Setup() 函数(如 func Setup() error),集中管理模块初始化顺序和错误处理。例如:
- config.Load() → 加载配置并校验
- logger.Init() → 初始化结构化日志器
- db.Connect() → 建立 DB 连接并 Ping
- cache.NewRedisClient() → 初始化缓存客户端
主函数中统一调用 if err := app.Setup(); err != nil { log.Fatal(err) },清晰可控,也方便单元测试时跳过或替换依赖。
用依赖注入容器简化模块组装
项目变大后,手动传递依赖易出错。可引入轻量 DI 库(如 uber-go/dig 或 google/wire)。Wire 是编译期生成代码的方案,无运行时反射开销,适合对性能敏感的服务。它通过注释标记构造函数,自动生成依赖图和初始化代码,让模块解耦、可插拔、易测试。
立即学习“go语言免费学习笔记(深入)”;
模板化新项目脚手架
用 go generate 或简单 shell 脚本 + 模板文件(如 project-template/)快速生成标准结构。典型目录包括:cmd/(入口)、internal/app/(核心逻辑)、internal/conf/(配置)、pkg/(可复用工具)。搭配 Makefile 提供一键命令:make init(安装依赖)、make run(启动)、make test(运行测试)。这样每次新建项目,30 秒就能跑起一个带健康检查、配置热加载、日志分级的骨架。










