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

ginbuilder 工具快速创建

ginbuilder github 地址

  • 快速创建一个ginweb项目: 目前apps下只有http服务,如果后续有需要的话,会添加上rpc服务,websocket服务
  • 后边如果有需要会添加上swagger

创建完成的目录结构

├── apps
│  ├── apis  // 所有的apis
│  │  ├── api.go  // api处理入口文件
│  │  └── hello   // hello demo
│  │      └── hello.go
│  ├── routers
│  │ ├── hello_router.go        // 不同的路由处理位置,hello.go 为测试路由
│  │ └── init_router.go         // 路由的初始化,项目优雅启动,优雅停止
│  └── service   // 所有服务的存储位置
│     └── hello.go
├── common                 // 全局包
│  ├── errorx
│  │  └── errorx.go
│  ├── logx
│  │  └── logx.go
│  └── responsex
│      └── responsex.go
├── config                 // 配置文件
│  ├── config.go
│  ├── config.yaml
│  └── internal_config
│      ├── logger.go
│      ├── mysql.go
│      ├── redis.go
│      └── system.go
├── global                 // 公用变量
│  └── global.go
├── go.mod
├── go.sum
├── internal               // 私有依赖
│  ├── mysql.go
│  └── redis.go
├── logs                   // 日志存储位置
│  └── 2023-04-28
│      └── ginbuilder.log
└── main.go                // 项目入口

使用该工具可以快速创建ginweb服务

1. 完成日志的初始化

  • 使用该日志库: “go.uber.org/zap”
  • 只需要修改config.yaml中的配置即可修改zap对应的配置

2. 封装gin路由

package routersimport ("{{.PkgName}}/global""context""fmt""go.uber.org/zap""net/http""os""os/signal""time""github.com/gin-gonic/gin"
)func runServer(router *gin.Engine) {srv := &http.Server{Addr:    fmt.Sprintf("%v:%d", global.GlobalC.System.Host, global.GlobalC.System.Port),Handler: router,}go func() {if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {zap.S().Fatalf("listen: %s\n", err)}}()quit := make(chan os.Signal)signal.Notify(quit, os.Interrupt)<-quitzap.S().Infoln("Listener Server ...")ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)defer cancel()if err := srv.Shutdown(ctx); err != nil {zap.S().Fatal("Server Shutdown:", err)}select {case <-ctx.Done():zap.S().Infoln("timeout of 3 seconds.")}zap.S().Infoln("Server exiting")
}

3. 初始化gorm

  • 使用该库: “gorm.io/gorm”

4. 初始化redis

  • 使用该库: “github.com/go-redis/redis/v8”

5. 封装response的基本响应结构


package responseximport ("{{.PkgName}}/common/errorx""github.com/gin-gonic/gin""net/http"
)type Response struct {Code    int    `json:"code"`Data    any    `json:"data"`Message string `json:"msg"`
}func Result(code int, data any, msg string, c *gin.Context) {c.JSON(http.StatusOK, Response{Code:    code,Data:    data,Message: msg,})
}func Ok(data any, msg string, c *gin.Context) {Result(int(errorx.SuccessCode), data, msg, c)
}func OkWithData(data any, c *gin.Context) {Result(int(errorx.SuccessCode), data, "成功", c)
}func OkWithMessage(msg string, c *gin.Context) {Result(int(errorx.SuccessCode), map[string]any{}, msg, c)
}func OkWith(c *gin.Context) {Result(int(errorx.SuccessCode), map[string]any{}, "成功", c)
}func Fail(data any, msg string, c *gin.Context) {Result(int(errorx.FailedCode), data, msg, c)
}func FailWithMessage(msg string, c *gin.Context) {Result(int(errorx.FailedCode), map[string]any{}, msg, c)
}func FailWithCode(code errorx.ErrorCode, msg string, c *gin.Context) {msg, ok := errorx.ErrorMap[code]if ok {Result(int(code), map[string]any{}, msg, c)}Result(int(errorx.FailedCode), map[string]any{}, msg, c)
}

6. 简单封装error状态码

package errorxtype ErrorCode intconst (SuccessCode   ErrorCode = 1000 // 成功SettingsError ErrorCode = 1001 //系统错误ArgumentError ErrorCode = 1002 //参数错误FailedCode    ErrorCode = 1999 // 返回失败
)var (ErrorMap = map[ErrorCode]string{SettingsError: "系统错误",ArgumentError: "参数错误",SuccessCode:   "成功",FailedCode:    "失败",}
)

使用方法

1. 安装ginbuilder

go install github.com/coderitx/ginbuilder@latest

2. 创建项目

# 项目会创建在 $GOPATH/src 下
# 如果不指定pkg,则会默认使用project同名
ginbuilder -project ${project-name} -pkg ${project-package-name}

3. 启动

cd ${projeck_path}
go mod tidy
go run main.go

4. 访问测试

浏览器直接访问:

  • hello
{"code":0,"data":"hello ${package name}","msg":"成功"}

命令行直接访问

curl 127.0.0.1:9999/api/hello{"code":0,"data":"hello ${package name}","msg":"成功"}

相关文章:

ginbuilder 工具快速创建

ginbuilder github 地址 快速创建一个ginweb项目&#xff1a; 目前apps下只有http服务&#xff0c;如果后续有需要的话&#xff0c;会添加上rpc服务&#xff0c;websocket服务后边如果有需要会添加上swagger 创建完成的目录结构 ├── apps │ ├── apis // 所有的apis…...

【Java基础面试宝典】堆、栈、方法区分别都存储了那些内容?wait 和 sleep 方法的区别?

目录 堆、栈、方法区分别都存储了那些内容&#xff1f; 堆&#xff08;heap&#xff09; 栈&#xff08;stack&#xff09; 方法区&#xff08;method&#xff09; 在 java 中 wait 和 sleep 方法的区别&#xff1f; 堆、栈、方法区分别都存储了那些内容&#xff1f; 堆&a…...

古剑飞仙手游Linux系统服务器架设教程

安装宝塔直接运行命令即可。 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 搭建环境&#xff1a; centos 7以上系统服务器 宝塔面板安装应用如下&#xff1a; Nginx1.14 mysql5.7 php5.6 1…...

python实战应用讲解-【numpy数组篇】常用函数(十)(附python示例代码)

目录 Python Numpy MaskedArray.ravel()函数 Python Numpy MaskedArray.reshape()函数 Python Numpy MaskedArray.resize()函数 Python Numpy MaskedArray.std()函数 Python Numpy MaskedArray.sum()函数 Python Numpy MaskedArray.swapaxes()函数 Python Numpy MaskedA…...

计算机组成原理(考研408)练习题#2

用于复习408或计算机组成原理期末考试。如有错误请在评论区指出。 So lets start studying with questions! それでは、問題の勉強を始めましょう&#xff01; 11.某 cache 采用全相联映射&#xff0c;假设 cache 有 3 块&#xff0c;程序运行过程中需要访问的主存块号依 次为…...

Apache POI,springboot中导出excel报表

2. Apache POI 2.1 介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下&#xff0c;POI 都是用于操作 Excel 文件。 Apache POI 的应用场景…...

CSS(一)-- 三种样式表

目录 1. 行内样式表 2. 内部样式表 3. 外部样式表&#xff08;即引入 .css文件&#xff09;&#xff08;重点掌握&#xff09; 1. 行内样式表 行内样式表&#xff08;内联样式表&#xff09;是在元素标签内部的 style 属性中设定 CSS 样式。适合于修改简单样式。 <di…...

嵌入式之Samba服务器搭建

在嵌入式系统开发应用平台中&#xff0c;tftp、nfs和samba服务器是最常用的文件传输工具 tftp和nfs是在嵌入式Linux开发环境中经常使用的传输工具 samba则是Linux和Windows之间的文件传输工具。 下面演示在linux上搭建Samba服务器 sudo apt-get install samba chmod -R 77…...

vue3+go——看到了就去学习吧

vue3go——看到了就去学习吧 Vue3.2 Vite Element-Plus 实现最基础的 CRUD1.效果展示【02:36】2.创建项目【03:16】3.添加github管理【04:10】4.引入element-plus【04:21】5.内容布局【08:59】6.布局优化【05:31】7.添加弹窗【09:34】8.ref改$ref【02:47】9.新增数据【09:22】…...

Perf工具统计CPU性能

Perf 性能检测工具 Perf 是一个内置于Linux内核中的工具&#xff0c;用于性能分析和调优。它可以对系统的CPU使用情况、内存使用情况、磁盘I/O、网络I/O等进行监控和分析&#xff0c;并提供了丰富的分析和可视化工具&#xff0c;以帮助用户定位和解决性能问题。perf可以进行函…...

考验大家指针功底的时候到了:请问如何理解 (int*)1 + 1 ?

来&#xff0c;猜猜看&#xff0c;这里的执行结果是什么&#xff1f; 这是今天课上的一道理解题&#xff0c;给大家一点点思考时间。 &#xff08;心里有答案了再往下滑哦&#xff09; 5 4 3 2 1 . 答案是&#xff0c;报warning&#xff01;因为%d不是用来输出指针的哈…...

英语基础-介词

介词 方位介词 in:在…里面 Its in the box. 在盒子里 in my backpack 在背包里 in the tree 长在树上on:在…上面&#xff08;指与物体表面接触&#xff09; Its on the box. 在盒子上(和盒子接触) on the floor.在地板上 on the tree.在树上under:在…下面 Its unde…...

Linux进程通信:进程组 会话

1. 进程组 &#xff08;1&#xff09;概念&#xff1a;一个或多个进程的集合&#xff0c;也称为“作业”。 &#xff08;2&#xff09;父进程创建子进程时&#xff0c;默认属于同一个进程组。进程组ID为组长进程ID。 &#xff08;3&#xff09;进程组中只要有一个进程存在&a…...

【前端面经】JS-深浅拷贝

理解深浅拷贝 深浅拷贝问题的出现是由于JavaScript对不同类型的存储方式而引发的。 对于原始数据类型&#xff0c;它们的值是直接存储在栈内存中&#xff1b; 而复杂数据类型&#xff0c;则在栈内存中记录它的指针&#xff0c;而指针指向堆内存中真正的值。 所以对于原始数据类…...

【自然语言处理】实验2布置:Word2Vec TransE案例

NLP_class 学堂在线《自然语言处理》实验课代码报告&#xff0c;授课老师为刘知远老师。课程链接&#xff1a;https://www.xuetangx.com/training/NLP080910033761/1017121?channeli.area.manual_search。 持续更新中。 所有代码为作者所写&#xff0c;并非最后的“标准答案…...

Redis集合底层实现原理

目录 本章重点简单动态字符串SDS集合底层实现原理zipListlistPackskipListquickListKey 与Value中元素的数量 本章重点 掌握Redis简单动态字符串了解Redis集合底层实现原理 简单动态字符串SDS SDS简介 我们Redis中无论是key还是value其数据类型都是字符串.我们Redis中的字符…...

OVS常用命令与使用总结

OVS常用命令与使用总结 说明 在平时使用ovs中&#xff0c;经常用到的ovs命令&#xff0c;参数&#xff0c;与举例总结&#xff0c;持续更新中… 进程启动 1.先准备ovs的工作目录&#xff0c;数据库存储路径等 mkdir -p /etc/openvswitch mkdir -p /var/run/openvswitch …...

一以贯之:从城市网络到“城市一张网”

《论语里仁》中子曰&#xff1a;“参乎&#xff0c;吾道一以贯之”。 孔子所说的“一以贯之”&#xff0c;逐渐成为了中国文化与哲学的重要组成部分&#xff0c;指明事物发展往往需要以标准化、集约化、融合化作为目标。这种智慧在数字化发展中格外重要。从云计算、大数据技术模…...

【Java校招面试】基础知识(四)——JVM

目录 前言一、基础概念二、反射三、类加载器ClassLoader四、JVM内存模型后记 前言 本篇主要介绍Java虚拟机——JVM的相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第四篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&#xff0c;返回…...

项目管理-计算专题(三点估算、PERT估算)

基本概念 通过考虑估算中的不确定性和风险&#xff0c;可以提高活动持续时间估算的准确性。这个概念源自计划评审技术(PERT)。PERT使用三种估算值来界定活动持续时间的近似区间: 最可能时间(tM)&#xff1a;基于最可能获得的资源、最可能取得的资源生产率、对资源可用时间的现…...

像素剧本圣殿惊艳效果:深紫+荧光绿UI中生成的古装剧场景描述高清截图

像素剧本圣殿惊艳效果&#xff1a;深紫荧光绿UI中生成的古装剧场景描述高清截图 1. 视觉震撼&#xff1a;当复古像素美学遇上AI剧本创作 在数字创作工具同质化严重的今天&#xff0c;像素剧本圣殿以其独特的视觉风格脱颖而出。这款基于Qwen2.5-14B-Instruct深度微调的专业剧本…...

嵌入式C++轻量级生命体基类:面向OOP的零开销实体抽象

1. 项目概述life_entity是一个面向嵌入式系统与游戏逻辑建模场景设计的轻量级 C 基类&#xff0c;其核心定位并非通用游戏引擎组件&#xff0c;而是为资源受限环境&#xff08;如 Cortex-M3/M4 微控制器运行 FreeRTOS 或裸机实时调度器&#xff09;中实现可继承、可多态、可生命…...

保姆级教程:在OpenEuler 22.03 LTS-SP4上,用cephadm搞定Ceph Pacific集群部署

在OpenEuler 22.03 LTS-SP4上部署Ceph Pacific集群的完整指南 OpenEuler作为国产操作系统的代表&#xff0c;凭借其高性能和安全性&#xff0c;正逐渐成为企业级应用的首选。而Ceph作为开源的分布式存储解决方案&#xff0c;以其高可靠性和可扩展性赢得了广泛认可。本文将详细介…...

小白也能玩转AI翻译:translategemma图文翻译快速入门指南

小白也能玩转AI翻译&#xff1a;translategemma图文翻译快速入门指南 1. 认识translategemma&#xff1a;你的私人翻译助手 translategemma-12b-it是Google基于Gemma 3模型开发的开源翻译模型&#xff0c;它能同时处理文本和图片中的文字翻译。想象一下&#xff0c;你正在国外…...

5分钟上手Vane容器化部署:从零搭建隐私优先的AI搜索引擎

5分钟上手Vane容器化部署&#xff1a;从零搭建隐私优先的AI搜索引擎 【免费下载链接】Vane Vane is an AI-powered answering engine. 项目地址: https://gitcode.com/GitHub_Trending/pe/Vane 想要在5分钟内搭建一个功能强大的AI搜索引擎吗&#xff1f;Vane是一个专注于…...

效率飙升,跳过proteus安装配置,用快马ai秒建仿真项目

最近在做一个温度监测系统的项目&#xff0c;需要验证电路设计的可行性。按照传统方式&#xff0c;我得先下载安装Proteus软件&#xff0c;配置各种库文件&#xff0c;光是环境准备就得折腾半天。不过这次尝试了用InsCode(快马)平台的AI功能&#xff0c;整个过程变得异常高效。…...

Kettle数据迁移实战:从CSV到MySQL的高效导入指南

1. 为什么选择Kettle进行CSV到MySQL的数据迁移 第一次接触数据迁移任务时&#xff0c;我试过用Python脚本逐行读取CSV写入MySQL&#xff0c;结果导入10万条数据花了近20分钟。后来发现Kettle这个神器&#xff0c;同样的数据量只需要2分钟就能搞定&#xff0c;效率提升简直惊人。…...

ESLint-Plugin-Unicorn规则优先级设置终极指南:如何平衡代码质量和开发效率

ESLint-Plugin-Unicorn规则优先级设置终极指南&#xff1a;如何平衡代码质量和开发效率 【免费下载链接】eslint-plugin-unicorn More than 100 powerful ESLint rules 项目地址: https://gitcode.com/gh_mirrors/es/eslint-plugin-unicorn ESLint-Plugin-Unicorn是一个…...

FastAPI日志配置终极指南:10个简单步骤实现生产级日志管理

FastAPI日志配置终极指南&#xff1a;10个简单步骤实现生产级日志管理 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI作为现代…...

C++手动实现共享智能指针my_shared_ptr|引用计数+删除器+完整可运行代码

1.共享智能指针的概念 共享型智能指针就是做出一个像JAVA中垃圾回收器,并且可以运用到所有资源,heap内存和系统资源都可以使用的系统。 shared_ptr实现了共享所有权(shared ownership)方式来管理资源对象,这意味没有一个特定的shared_ptr拥有资源对象。相反,这些指向同一…...