go将request body绑定到不同的结构体中教程

 更新时间:2023年10月10日 11:44:50   作者:Go 技术论坛文档  
这篇文章主要为大家介绍了go将request body绑定到不同的结构体中教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

c.Request.Body 方法绑定数据

一般通过调用 c.Request.Body 方法绑定数据,但不能多次调用这个方法。

type formA struct {
  Foo string `json:"foo" xml:"foo" binding:"required"`
}
type formB struct {
  Bar string `json:"bar" xml:"bar" binding:"required"`
}
func SomeHandler(c *gin.Context) {
  objA := formA{}
  objB := formB{}
  // c.ShouldBind 使用了 c.Request.Body,不可重用。
  if errA := c.ShouldBind(&objA); errA == nil {
    c.String(http.StatusOK, `the body should be formA`)
  // 因为现在 c.Request.Body 是 EOF,所以这里会报错。
  } else if errB := c.ShouldBind(&objB); errB == nil {
    c.String(http.StatusOK, `the body should be formB`)
  } else {
    ...
  }
}

多次绑定

可以使用 c.ShouldBindBodyWith.

func SomeHandler(c *gin.Context) {
  objA := formA{}
  objB := formB{}
  // 读取 c.Request.Body 并将结果存入上下文。
  if errA := c.ShouldBindBodyWith(&objA, binding.JSON); errA == nil {
    c.String(http.StatusOK, `the body should be formA`)
  // 这时, 复用存储在上下文中的 body。
  } else if errB := c.ShouldBindBodyWith(&objB, binding.JSON); errB == nil {
    c.String(http.StatusOK, `the body should be formB JSON`)
  // 可以接受其他格式
  } else if errB2 := c.ShouldBindBodyWith(&objB, binding.XML); errB2 == nil {
    c.String(http.StatusOK, `the body should be formB XML`)
  } else {
    ...
  }
}

c.ShouldBindBodyWith 会在绑定之前将 body 存储到上下文中。 这会对性能造成轻微影响,如果调用一次就能完成绑定的话,那就不要用这个方法。

只有某些格式需要此功能,如 JSON, XML, MsgPack, ProtoBuf。

对于其他格式,如 Query, Form, FormPost, FormMultipart 可以多次调用 c.ShouldBind() 而不会造成任任何性能损失,详见

以上就是go将request body绑定到不同的结构体中教程的详细内容,更多关于go request body绑定结构体的资料请关注脚本之家其它相关文章!

相关文章

  • go zero微服务高在请求量下如何优化

    go zero微服务高在请求量下如何优化

    这篇文章主要为大家介绍了go zero微服务高在请求量下的优化处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Go 内联优化让程序员爱不释手

    Go 内联优化让程序员爱不释手

    这篇文章主要介绍了Go 内联优化让程序员爱不释手,内联是在编译过程中自动进行的一类基本优化之一,文章围绕主题展开更多详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • Go 不支持 []T转换为[]interface类型详解

    Go 不支持 []T转换为[]interface类型详解

    这篇文章主要为大家介绍了Go不支持[]T转换为[]interface类型详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Go语言的方法接受者类型用值类型还是指针类型?

    Go语言的方法接受者类型用值类型还是指针类型?

    这篇文章主要介绍了Go语言的方法接受者类型用值类型还是指针类型?本文还同时讲解了关于接受者的命名方式,需要的朋友可以参考下
    2014-10-10
  • golang映射Map的方法步骤

    golang映射Map的方法步骤

    这篇文章主要介绍了golang映射Map的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Golang语言如何高效拼接字符串详解

    Golang语言如何高效拼接字符串详解

    最近在做性能优化,有个函数里面的耗时特别长,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其实有很多种实现,下面这篇文章主要给大家介绍了关于Golang语言如何高效拼接字符串的相关资料,需要的朋友可以参考下
    2021-11-11
  • Go语言框架快速集成限流中间件详解

    Go语言框架快速集成限流中间件详解

    这篇文章主要为大家介绍了Go语言框架快速集成限流中间件详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Go语言反射获取类型属性和方法示例

    Go语言反射获取类型属性和方法示例

    这篇文章主要为大家介绍了本文将介绍 Go 反射 reflect.StructField 和 reflect.Method 相关的内容,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go语言中html/template模块详细功能介绍与示例代码

    Go语言中html/template模块详细功能介绍与示例代码

    这篇文章主要介绍了Go语言中html/template模块详细功能介绍与示例代码,这里说的是go 语言中自带的包html/template里的一些基本操作,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • Golang之sync.Pool对象池对象重用机制总结

    Golang之sync.Pool对象池对象重用机制总结

    这篇文章主要对Golang的sync.Pool对象池对象重用机制做了一个总结,文中有相关的代码示例和图解,具有一定的参考价值,需要的朋友可以参考下
    2023-07-07

最新评论