当前位置: 首页 > news >正文

Goland如何玩依赖注入——基于gone@v2创建一个service

经过多天的工作,终于把gone2的beta版本发布出去了。在v2版本中,做了很多更新,最大的改进是将一些不必要的概念给隐藏起来了,提供了Provider机制……

文章目录

    • 1. 安装**gonectr**
    • 2.创建项目
      • 2.1 项目结构
    • 2.2 简单说明
    • 3. 启动项目
      • 3.1 数据库
      • 3.2 本地开发启动
      • 3.3 服务部署

1. 安装gonectr

go install github.com/gone-io/gonectr@latest
gonectr -v
Gonectr version: v0.0.17

版本应该大于:v0.0.17

2.创建项目

gonectr create -t v2+web+mysql demo

在这里插入图片描述
项目是以https://github.com/gone-io/template-v2-web-mysql 为模板创建的。

2.1 项目结构

├── go.mod
├── go.sum
├── Dockerfile
├── docker-compose.yaml
├── Makefile
├── README.md
├── cmd
│   └── server
│       ├── import.gone.go
│       └── main.go
├── config
│   └── default.properties
├── internal
│   ├── controller
│   │   ├── init.gone.go
│   │   └── user.go
│   ├── interface
│   │   ├── entity
│   │   │   └── user.go
│   │   ├── mock
│   │   │   ├── i_depenendent.gone.go
│   │   │   ├── i_user.gone.go
│   │   │   ├── i_user_token.gone.go
│   │   │   └── priest.gone.go
│   │   ├── package.go
│   │   └── service
│   │       ├── i_depenendent.go
│   │       ├── i_user.go
│   │       └── i_user_token.go
│   ├── loader.go
│   ├── module
│   │   ├── dependent
│   │   │   ├── dependent.go
│   │   │   └── init.gone.go
│   │   └── user
│   │       ├── init.gone.go
│   │       ├── token.go
│   │       ├── user.go
│   │       └── user_test.go
│   ├── pkg
│   │   ├── e
│   │   │   └── error.go
│   │   └── utils
│   │       ├── ctx.go
│   │       ├── password.go
│   │       └── token.go
│   └── router
│       ├── auth_router.go
│       ├── init.gone.go
│       └── pub_router.go
├── scripts
│   └── mysql
│       └── initdb.d
│           └── user.sql
└── tests
    └── api
        ├── http-client.env.json
        └── user.http

2.2 简单说明

  • cmd/server/main.go 是服务的入口文件:
package main

import (
	"demo/internal"
	"github.com/gone-io/gone/v2"
)

func main() {
	gone.
		Loads(internal.Load).
		Serve()
}
  • config 是配置文件目录,支持多种配置文件格式,包括:JSON, TOML, YAML, HCL, INI, envfile or Java properties,配置文件的读取的底层是使用viper实现的。
  • internal 是业务代码目录,包括webController、 业务接口定义 和 业务逻辑实现等
    • internal/router 路由分组
    • internal/controller web接口定义
    • internal/interface 业务接口定义
    • internal/module 业务逻辑实现
  • scripts 项目脚本
  • tests 接口测试的http文件,可以直接使用goland打开
    在这里插入图片描述

3. 启动项目

3.1 数据库

该项目使用的mysql数据库,需要:

  1. 创建数据库,然后导入位于 scripts/mysql/initdb.d/user.sql的SQL文件
  2. 按实际情况修改配置文件config/properties
# 使用mysql
database.driver-name=mysql

db.host=localhost
db.port=3306
db.name=demo
db.username=root
db.password=123456

# 数据源配置 配置中,使用${key}来引用配置文件中的值
database.dsn=${db.username}:${db.password}@tcp(${db.host}:${db.port})/${db.name}?charset=utf8mb4&loc=Local

如果本地安装了docker-desktop,只需要执行:

docker compose up -d mysql

3.2 本地开发启动

首先,下载依赖:

go mod tidy

有多种方式:

  • 1. 使用gonectr来启动项目:
gonectr run ./cmd/server

会看到屏幕打印内容如下:
在这里插入图片描述

  • 2. 使用go run命令来启动
    **但是请注意,需要先执行go generate ./...来生成辅助代码,这些辅助代码包含用于将 组件(Goner)注册到框架和用于mock测试。
go generate ./...
go run ./cmd/server
  • 3. 使用goland
    点开Edit Configurations,可以已经默认添加了一个启动项,并且在Before launch配置 了 go generate ./...,所以直接点击”运行“就可以了。
    在这里插入图片描述
    在这里插入图片描述
  • 3. 使用vs code
    在vscode中已经配置了启动项和启动前的任务,所以侧边栏切换到"运行和调试"点击 运行即可。
  • .vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "server",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "cwd": "${workspaceFolder}",
            "program": "${workspaceFolder}/cmd/server",
            "preLaunchTask": "generate"
        }
    ]
}
  • .vscode/tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "generate",
            "type": "shell",
            "command": "go generate ./...",
            "problemMatcher": []
        }
    ]
}

在这里插入图片描述

3.3 服务部署

项目同时提供了docker-compose.yaml 和 Dockerfile,方便生成镜像部署到服务器上。

http://www.dtcms.com/a/61310.html

相关文章:

  • 2025-03-10 学习记录--C/C++-C语言 易错点 大总结
  • 【leetcode hot 100 2】两数相加
  • Git 设置全局代理
  • 第3节:IP地址分类与子网划分实战指南
  • 『PostgreSQL』PGSQL备份与还原实操指南
  • MySQL的约束
  • 学习笔记12——并发编程之线程之间协作方式
  • rust语言match模式匹配涉及转移所有权Error Case
  • Java本地方法根据线上地址下载图片到本地然后返回本地可以访问的地址
  • 【氮化镓】开态GaN HEMTs中氧诱导Vth漂移的缺陷演化
  • 力扣:找到一个数字的 K 美丽值(C++)
  • 面试题之强缓存协商缓存
  • javascript-es6 (六)
  • 从机器学习到生成式AI狂潮:AWS的AI征程从未停息
  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-7.2.2自动扩缩容策略(基于HPA)
  • 2025年总结zabbix手动部署过程!
  • 【Python爬虫】使用python脚本拉取网页指定小说章节
  • [250310] Mistral 发布世界领先的文档理解 API:Mistral OCR | 谷歌利用 AI 保护自然的三种新方式
  • 可视化图解算法:反转链表
  • 《面向长尾分布的甲骨文识别算法设计与实现 》开题报告
  • 力扣hot100二刷——哈希、双指针、滑动窗口
  • C/C++中使用CopyFile、CopyFileEx原理、用法、区别及分别在哪些场景使用
  • 【gcc编译以及Makefile与GDB调试】
  • python LLM工具包
  • JavaScript数据类型和内存空间
  • 20-智慧社区物业管理平台
  • Java【多线程】(3)单例模式与线程安全
  • 大模型如何从开始到编译出Engine
  • [免费]微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端+Vue管理端)(高级版)【论文+源码+SQL脚本】
  • 一个简化版的进程内通信库实现