★ 三种路由注册方式:函数/对象/规范路由对比
结论:GoFrame v2 支持函数注册、对象注册与规范路由注册三种方式;生产首选“规范路由”(Req/Res + g.Meta):参数自动绑定、v 标签自动校验、自动生成 OpenAPI 与统一返回,团队代码一致性最好。
一、三种方式要点
- 函数注册:
s.BindHandler(pattern, handler),handler 为func(r *ghttp.Request),最底层、最直白。 - 对象注册:
s.BindObject(pattern, object, ...),将对象的公开方法按方法名映射为路由节点,适合把一组接口聚在对象上。 - 规范路由注册:handler 形如
func(ctx, *Req)(*Res, error),Req 内嵌 g.Meta 声明 method/path,注册后由框架自动完成路由与文档装配。
二、对比表
| 方式 | 注册写法 | 参数绑定 | 自动校验 | OpenAPI | 推荐度 |
|---|---|---|---|---|---|
| 函数注册 | BindHandler("GET:/x", fn) | 手动 r.Get/Parse | 手动 | 不支持 | 简单接口 |
| 对象注册 | BindObject("/user", obj) | 手动/Parse | 手动 | 弱 | v2 中少用 |
| 规范路由 | group.Bind(handler) + g.Meta | 自动 | 自动(v 标签) | 自动生成 | 生产首选 |
代码示例
函数注册:
s.BindHandler("GET:/hello", func(r *ghttp.Request) {
r.Response.Write("hello")
})
对象注册:
type UserApi struct{}
func (a *UserApi) Info(r *ghttp.Request) { r.Response.Write("user info") }
s.BindObject("/user", new(UserApi)) // GET /user/info
规范路由注册:
func Hello(ctx context.Context, req *HelloReq) (res *HelloRes, err error) {
return &HelloRes{Reply: "hi " + req.Name}, nil
}
s.Group("/", func(group *ghttp.RouterGroup) {
group.Middleware(ghttp.MiddlewareHandlerResponse) // 统一返回
group.Bind(Hello) // 路由取自 g.Meta
})
常见追问 / 记忆点
- 追问:同一接口能同时用两种方式注册吗?→ 可以但会路由冲突/重复注册,实践中一个接口固定一种注册方式。
- 追问:函数注册支持指定 method 吗?→ 支持,pattern 可写作 "GET:/path"、"POST:/path" 等。
- 记忆点:函数 = 最底层;对象 = 方法集映射;规范路由 = 约定 + 自动装配(v2 主推)。