Gone 简介
Gone 是一款基于 Go 语言的轻量级依赖注入框架,它由三个核心部分组成,让 Go 开发变得更加简单高效:
1. 核心框架 (gone)
提供完整且优雅的依赖注入实现:
- 结构体字段注入 - 通过简单标签即可完成依赖声明
- 函数参数智能注入 - 自动识别并注入所需依赖
- 灵活的 Provider 扩展机制 - 轻松集成各类组件
- 内置实用基础组件:
gone.Logger- 功能全面的日志接口及高效实现gone.Configure- 灵活易用的配置管理方案
核心框架设计简洁,零第三方依赖,可独立使用
2. 组件库 (goner)
基于 Gone 框架打造的丰富组件生态,覆盖微服务开发全场景:
- 配置管理:支持 Viper、Apollo、Nacos 等多种配置中心
- 日志系统:集成高性能 Zap 日志库
- Web 开发:无缝对接 Gin 框架
- 数据访问:支持 GORM、XORM 等主流 ORM
- 服务调用:高效 gRPC 和灵活 HTTP 客户端
- AI 能力:集成 OpenAI、DeepSeek 等智能接口
- 更多精选组件...
独特优势:
- 基于接口的松耦合设计,大幅提升可维护性
- 模块化组件按需引入,避免冗余依赖
- 提供开发最佳实践,降低学习门槛
3. 开发工具 (gonectl)
配套的效率工具集,助力开发:
- 一键生成项目脚手架
- 自动生成 Goner 加载代码
- 生成测试友好的 Mock 代码
为什么选择 Gone
- 简单直观:只需嵌入
gone.Flag并标记gone标签,依赖注入就这么简单 - 扩展性强:强大的
Provider机制让任何第三方库都能轻松集成 - 轻量纯净:核心框架 gone 零外部依赖,专注做好依赖注入
- 生态完善:丰富且持续扩展的组件库,全面覆盖主流技术栈
给 Java 开发者的提示:Gone 提供类似 Spring 的依赖注入体验,但更轻量、更符合 Go 语言的设计哲学和使用习惯。
快速上手
安装 gonectr 工具
两种安装方式:
- 从 GitHub Releases 页面下载对应系统版本
- 推荐使用 Go 工具直接安装:
go install github.com/gone-io/gonectr@latest
安装后,执行
gonectr -v检查版本,最新版本为v0.0.18。更多关于gonectr的使用说明,请参考:gone-io/gonectr
创建示例项目
执行以下命令创建一个基于 MySQL 的 Web 项目:
gonectr create -t v2+web+mysql gone-demo
你将看到类似输出:
Enumerating objects: 63, done.
Counting objects: 100% (63/63), done.
Compressing objects: 100% (52/52), done.
Total 63 (delta 1), reused 45 (delta 0), pack-reused 0 (from 0)
Updated file: gone-demo/go.mod
Updated file: gone-demo/.idea/runConfigurations/go_build_template_module_cmd_server.xml
Updated file: gone-demo/cmd/server/main.go
Updated file: gone-demo/internal/controller/user.go
Updated file: gone-demo/internal/interface/service/i_user.go
Updated file: gone-demo/internal/module/user/token.go
Updated file: gone-demo/internal/module/user/user.go
Updated file: gone-demo/internal/module/user/user_test.go
Updated file: gone-demo/internal/pkg/utils/ctx.go
Updated file: gone-demo/internal/router/auth_router.go
运行项目
第一步,启动 MySQL:
docker compose up -d mysql
第二步,启动项目:
方式一:使用标准 Go 命令
# 生成辅助代码
go generate ./...
# 启动 Web 服务
go run ./cmd/server
方式二:使用 gonectr 命令(自动执行 generate)
gonectr run ./cmd/server
服务将在 8080 端口启动,输出日志如下:
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
2025-04-08T10:31:01.104+0800|INFO|log/logger_context.go:90|PING DATABASE mysql
2025-04-08T10:31:01.125+0800|INFO|controller/user.go:22|mount user controller
2025-04-08T10:31:01.129+0800|INFO|gin@v1.0.8/server.go:68|Server Listen At http://0.0.0.0:8080
项目结构一览
.
├── Dockerfile
├── Makefile
├── README.md
├── README_CN.md
├── cmd
│ └── server
│ └── main.go # 程序入口
├── config # 配置文件目录
│ └── default.properties
├── docker-compose.yaml
├── go.mod
├── go.sum
├── internal
│ ├── controller # 控制器层
│ │ └── user.go
│ ├── interface # 接口定义
│ │ ├── entity
│ │ │ └── user.go
│ │ ├── package.go
│ │ └── service
│ │ ├── i_depenendent.go
│ │ ├── i_user.go
│ │ └── i_user_token.go
│ ├── loader.go # 组件加载器
│ ├── module # 模块实现
│ │ ├── dependent
│ │ │ └── dependent.go
│ │ └── user
│ │ ├── token.go
│ │ ├── user.go
│ │ └── user_test.go
│ ├── pkg # 内部工具包
│ │ ├── e
│ │ │ └── error.go
│ │ └── utils
│ │ ├── ctx.go
│ │ ├── password.go
│ │ └── token.go
│ └── router # 路由定义
│ ├── auth_router.go
│ └── pub_router.go
├── scripts # 脚本目录
│ └── mysql
│ └── initdb.d
│ └── user.sql
└── tests # 接口测试
└── api
├── http-client.env.json
└── user.http
依赖注入实战解析
看一个典型示例 internal/module/user/user.go:
// ...
type iUser struct {
gone.Flag
db xorm.Engine `gone:"*"`
log gone.Logger `gone:"*"`
iDep service.IDependent `gone:"*"`
iUserToken service.IUserToken `gone:"*"`
}
// ...
这段代码展示了 Gone 的核心特性:
iUser结构体实现了internal/interface/service/i_user.go中定义的IUserLogin接口- 通过嵌入
gone.Flag将结构体标记为 Gone 组件 - 使用
gone:"*"标签声明需要注入的依赖项 - 注入可以是基础组件(如
xorm.Engine、gone.Logger)或自定义服务接口
探索更多功能
Gone 生态提供了丰富的组件支持各种场景开发:
-
Gone Gin 组件 - 快速构建 Web 服务
-
Gone Zap 组件 - 高性能日志系统
-
Gone Xorm 组件 - 简化数据库操作
-
Gone Viper 组件 - 灵活配置管理
-
Gone Tracer 组件 - 分布式链路追踪