go-mir v5.0.1 发布,用 Go 结构体标签定义 handler 路由信息的辅助库
go-mir v5.0.1 发布了,v5 版本带来全新的 RESTful API 开发方式,提供媲美 gRPC 服务开发的体验,方便快捷,欢迎使用。
Mir 是一套提供类似 gRPC 服务开发体验的快速开发 RESTful API 后端开发脚手架,适配多种 HTTP 框架,包括 Gin, Chi, Hertz, Echo, Iris, Fiber, Macaron, Mux, httprouter。
使用说明
- 生成样板项目
% go install github.com/alimy/mir/mirc/v5@latest % mirc new -h create template project Usage: mirc new [flags] Flags: -d, --dst string genereted destination target directory (default ".") -h, --help help for new --mir string mir replace package name or place -p, --pkg string project's package name (default "github.com/alimy/mir-example") -s, --style string generated engine style eg: gin,chi,mux,hertz,echo,iris,fiber,fiber-v2,macaron,httprouter (default "gin") % mirc new -d example % tree example example . |-- Makefile |-- README.md |-- go.mod |-- go.sum |-- main.go |-- mirc | |-- auto | | `-- api | | |-- site.go | | |-- v1 | | | `-- site.go | | `-- v2 | | `-- site.go | |-- gen.go | `-- routes | |-- site.go | |-- v1 | | `-- site.go | `-- v2 | `-- site.go `-- servants |-- core.go |-- servants.go |-- site.go |-- site_v1.go `-- site_v2.go % cd example % make generate % make run
-
RESTful API 接口定义
// file: mirc/routes.go package routes import ( . "github.com/alimy/mir/v5" ) type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } // User user interface info type User struct { // 标示为 API Entry, group为v1, 带有中间件接口 Schema `mir:"v1,chain"` Login func(Post, LoginReq) LoginResp `mir:"login"` Logout func(Post) `mir:"logout"` }
- 代码生成
// file: mirc/auto/api/routes/v1.go // Code generated by go-mir. DO NOT EDIT. // versions: // - mir v5.0.0 package v1 import ( "net/http" "github.com/alimy/mir/v5" "github.com/gin-gonic/gin" ) type _binding_ interface { Bind(*gin.Context) mir.Error } type _render_ interface { Render(*gin.Context) } type _default_ interface { Bind(*gin.Context, any) mir.Error Render(*gin.Context, any, mir.Error) } type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } type User interface { _default_ // Chain provide handlers chain for gin Chain() gin.HandlersChain Login(*gin.Context, *LoginReq) (*LoginResp, mir.Error) Logout(*gin.Context) mir.Error mustEmbedUnimplementedUserServant() } // RegisterUserServant register User servant to gin func RegisterUserServant(e *gin.Engine, s User) { router := e.Group("v1") // use chain for router middlewares := s.Chain() router.Use(middlewares...) // register routes info to router router.Handle("POST", "login", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } req := new(LoginReq) if err := s.Bind(c, req); err != nil { s.Render(c, nil, err) return } resp, err := s.Login(req) s.Render(c, resp, err) }) router.Handle("POST", "logout", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } s.Render(c, nil, s.Logout(c)) }) } func (UnimplementedUserServant) Chain() gin.HandlersChain { return nil } func (UnimplementedUserServant) Login(c *gin.Context, req *LoginReq) (*LoginResp, mir.Error) { return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) Logout(c *gin.Context) mir.Error { return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) mustEmbedUnimplementedUserServant() {}
- 接口实现
// file: servants/user.go package servants import ( api "github.com/alimy/mir-example/v5/mirc/auto/api/v1" "github.com/alimy/mir/v5" "github.com/gin-gonic/gin" ) type baseSrv struct{} func (baseSrv) Bind(c *gin.Context, obj any) mir.Error { if err := c.ShouldBind(obj); err != nil { mir.NewError(http.StatusBadRequest, err) } return nil } func (baseSrv) Render(c *gin.Context, data any, err mir.Error) { if err == nil { c.JSON(http.StatusOK, data) } else { c.JSON(err.StatusCode(), err.Error()) } } type userSrv struct { baseSrv api.UnimplementedUserServant // TODO: add other fields } func newUserSrv() api.User { return &userSrv{} }
- 服务注册
// file: servants/servants.go package servants import ( api "github.com/alimy/mir-example/v5/mirc/auto/api/v1" "github.com/gin-gonic/gin" ) // RegisterServants register all the servants to gin.Engine func RegisterServants(e *gin.Engine) { api.RegisterUserServant(e, newUserSrv()) // TODO: some other servant to register }
-
程序启动
// file: main.go package main import ( "log" "github.com/alimy/mir-example/v5/servants" "github.com/gin-gonic/gin" ) func main() { e := gin.Default() // register servants to gin servants.RegisterServants(e) // start servant service if err := e.Run(); err != nil { log.Fatal(err) } }
使用 go-mir 的项目
- paopao-ce - 一个清新文艺的微社区,提供类似 Twiter / 微博的推文分享服务;
paopao-ce 通过使用 go-mir 更好、更便捷的开发 RESTful API 服务与 gRPC 服务。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
速来体验丨MaxKB v1.10.7 LTS 版本发布,支持接入 Qwen3
2025年4月29日,MaxKB开源企业级AI助手正式发布v1.10.7 LTS版本。这一版本在第一时间支持接入Qwen3大模型,并且进行了一些功能优化和问题修复。 亮点更新 ■MaxKB支持接入Qwen3 2025年4月29日,阿里巴巴开源新一代通义千问模型Qwen3。Qwen3系列模型包含2个混合专家(MoE)模型和6个稠密(Dense)模型,覆盖6亿、17亿、40亿、80亿、140亿、320亿、300亿、2350亿全尺寸参数规模。Qwen3有效融合了推理模式和非推理模式,一个模型同时兼具之前的QwQ模型(推理模式,用于数学、代码、逻辑推理等场景)和Instruct模型(非推理模式,通用对话等场景)的回复能力。 在MaxKB中依次选择“系统管理”→“模型设置”→“添加模型”,选择“阿里云百炼”供应商,在添加模型表单中填写好Qwen3模型的信息保存即可。 ▲附图 MaxKB支持接入Qwen3 功能优化 ■应用:优化对话日志查询的性能。 问题修复 ■知识库:修复上传的Excel文件中,如果单元格内容中包含换行符时,上传后数据显示错乱的问题; ■应用:修复对话时获取应用详情中包含敏感信息...
- 下一篇
时隔三年,Oracle Solaris 11.4.81 CBE 正式发布
Oracle Solaris 11.4.81 CBE 现已发布,作为 Oracle Solaris“通用构建环境”的最新版本,它本质上是一个社区支持的 Solaris 非生产版本,旨在供免费/开源软件开发人员使用。 Oracle Solaris 11.4.81 CBE 在过去三年中未发布任何CBE 更新,而如今甲骨文出乎意料地发布了这个新版本。 Oracle Solaris 11.4.81 CBE 包含了过去三年的所有 Solaris 更新,包括新的 GCC 编译器版本、其他更新的编译器版本、Python 和 PHP 的新版本以及其他关键软件包、许多 libc 更新以及许多其他通用开源软件更新。 Solaris 内核在过去三年中有所改进,包括通用的内核 I/O 弹性事件和其他更改。 Oracle Solaris 11.4.81 CBE 也包含一些 ZFS 文件系统改进,例如 .zfs/clone 下的 ZFS clonedir 挂载点、ZFS 文件保留、ZFS mount/unmount -r 以及 ZFS 使用原始加密发送。在桌面方面,GNOME 45 可用,X.Org 服务器是其桌...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- 2048小游戏-低调大师作品
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Hadoop3单机部署,实现最简伪集群