v1.15 版本开始, Request 请求对象支持通过 struct tag 的方式为输入对象的属性绑定默认值。默认值的 struct tag 名称为 d(也可以使用 default)。

我们来看一个示例以便更好理解。

参数对象定义

  1. type GetListReq struct {
  2. g.Meta `path:"/" method:"get"`
  3. Type string `v:"required#请选择内容模型" dc:"内容模型"`
  4. Page int `v:"min:0#分页号码错误" dc:"分页号码" d:"1"`
  5. Size int `v:"max:50#分页数量最大50条" dc:"分页数量,最大50" d:"10"`
  6. Sort int `v:"in:0,1,2#排序类型不合法" dc:"排序类型(0:最新, 默认。1:活跃, 2:热度)"`
  7. }
  8. type GetListRes struct {
  9. Items []Item `dc:"内容列表"`
  10. }
  11. type Item struct {
  12. Id int64 `dc:"内容ID"`
  13. Title string `dc:"内容标题"`
  14. }

这个是一个查询内容列表请求的参数接受对象,其中我们通过 d 的标签为属性 PageSize 指定了默认值,当这两个参数不传递时,默认为 110,表示分页从第 1 页开始,每页查询数量为 10

参数对象使用

  1. package main
  2. import (
  3. "context"
  4. "github.com/gogf/gf/v2/frame/g"
  5. "github.com/gogf/gf/v2/net/ghttp"
  6. )
  7. type GetListReq struct {
  8. g.Meta `path:"/" method:"get"`
  9. Type string `v:"required#请选择内容模型" dc:"内容模型"`
  10. Page int `v:"min:0#分页号码错误" dc:"分页号码" d:"1"`
  11. Size int `v:"max:50#分页数量最大50条" dc:"分页数量,最大50" d:"10"`
  12. Sort int `v:"in:0,1,2#排序类型不合法" dc:"排序类型(0:最新, 默认。1:活跃, 2:热度)"`
  13. }
  14. type GetListRes struct {
  15. Items []Item `dc:"内容列表"`
  16. }
  17. type Item struct {
  18. Id int64 `dc:"内容ID"`
  19. Title string `dc:"内容标题"`
  20. }
  21. type Controller struct{}
  22. func (Controller) GetList(ctx context.Context, req *GetListReq) (res *GetListRes, err error) {
  23. g.Log().Info(ctx, req)
  24. return
  25. }
  26. func main() {
  27. s := g.Server()
  28. s.Group("/content", func(group *ghttp.RouterGroup) {
  29. group.Middleware(ghttp.MiddlewareHandlerResponse)
  30. group.Bind(&Controller{})
  31. })
  32. s.SetPort(8199)
  33. s.Run()
  34. }

我们访问以下地址,并查看服务端终端输出结果:

http://127.0.0.1:8199/content?type=ask

  1. 2023-03-21 21:58:23.058 [INFO] {2883f9c2dc734e170a35c73ea3560b4b} {"Type":"ask","Page":1,"Size":10,"Sort":0}

http://127.0.0.1:8199/content?type=ask&page=

  1. 2023-03-21 21:58:32.555 [INFO] {b86e22f9de734e170b35c73edf07859d} {"Type":"ask","Page":1,"Size":10,"Sort":0}

http://127.0.0.1:8199/content?type=ask&page=2

  1. 2023-03-21 22:01:02.907 [INFO] {a016c8fa01744e170f35c73e99082f53} {"Type":"ask","Page":2,"Size":10,"Sort":0}

可以看到,当调用端不传递或者传递空的 page 参数时,服务端都将使用定义的默认值;而当调用端传递具体的 page 参数时,默认值并不会生效。

注意事项

默认值参数绑定是根据客户端 未提交该参数 来识别是否启用默认值,如果客户端已经提交了该参数, 即便该参数值是空字符串 也会被当做客户端已经传递了具体的值,那么服务端数据结构上的默认值标签将不会生效。