设为首页 加入收藏

TOP

go-zero单体服务使用泛型简化注册Handler路由(三)
2023-07-23 13:25:48 】 浏览:88
Tags:go-zero 单体服 简化注 Handler 路由
st.Server中添加路由 []rest.Route{ //路由数组 { Method: http.MethodGet, Path: "/from/:name", //路由 Handler: BaseHandlerFunc(serverCtx,logic.GreetLogic{}), }, { Method: http.MethodGet, Path: "/to/:name", //路由 Handler: BaseHandlerFunc(serverCtx,logic.CustomLogic{}), }, }, ) }

其他地方不需要修改
我们启动一下

go run greet.go -f etc/greet-api.yaml

然后在浏览器中请求一下http://localhost:8888/from/youhttp://localhost:8888/to/youhttp://localhost:8888/too/you

现在,在添加新的logic做路由映射时,就可以直接简化掉添加xxxxhandler.go文件了,实际上是将这个Handler移动到了xxxxlogic.go中。

新手,不喜轻喷

本文代码放在go-zero-monolithic-service-generics

五、后面对于之前繁琐的泛型使用进行了简化

BaseHandlerFunc中改为

func BaseHandlerFunc[T logic.BaseLogic](svcCtx *svc.ServiceContext, t T) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		var req types.Request
		if err := httpx.Parse(r, &req); err != nil {
			httpx.Error(w, err)
			return
		}
		var ins T
		ins.Handler(req, w, r, svcCtx)
		//通过泛型动态调用不同结构体的Handler方法
		// cc := logic.New[T]()
		// cc.LogicHandler(req, w, r, svcCtx)
	}
}

baselogic.go改为

package logic 
 import ( 
 "greet/internal/svc" 
 "greet/internal/types" 
 "net/http" 
 ) 
 type BaseLogic interface { 
   any 
   Handler(req types.Request, w http.ResponseWriter, r *http.Request, svcCtx *svc.ServiceContext) //每一个结构体中必须要继承一下Handler方法,例如customlogic.go和greetlogic.go中的Handler方法 
 } 
   // type logic[T BaseLogic] struct { 
 // data T 
 // } 
   // func New[T BaseLogic]() logic[T] { 
 // c := logic[T]{} 
 // var ins T 
 // c.data = ins 
 // return c 
 // } 
 // func (a *logic[T]) LogicHandler(req types.Request, w http.ResponseWriter, r *http.Request, svcCtx *svc.ServiceContext) { 
 // a.data.Handler(req, w, r, svcCtx) 
 // } 

这样就可以了

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【Docker】使用Docker Client和Do.. 下一篇【golang】多个defer的执行顺序以..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目