Gone —— Golang依赖注入 + 组件库 + 开发工具,提供类似 Java Spring 的依赖注入体验

3,033 阅读4分钟
gone logo

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 工具

两种安装方式:

安装后,执行 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.Enginegone.Logger)或自定义服务接口

探索更多功能

Gone 生态提供了丰富的组件支持各种场景开发: