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语言中的Option设计模式

    一文详解Go语言中的Option设计模式

    这篇文章主要为大家详细介绍了Go语言中Option设计模式的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-05-05
  • 浅析Go语言容器之数组和切片的使用

    浅析Go语言容器之数组和切片的使用

    在 Java 的核心库中,集合框架可谓鼎鼎大名:Array 、List、Set等等,随便拎一个出来都值得开发者好好学习如何使用甚至是背后的设计源码。虽然Go语言没有如此丰富的容器类型,但也有一些基本的容器供开发者使用,接下来让我们认识一下这些容器类型吧
    2022-11-11
  • Golang判断struct/slice/map是否相等以及对比的方法总结

    Golang判断struct/slice/map是否相等以及对比的方法总结

    平时开发中对比两个struct或者map、slice是否相等是经常遇到的,有很多对比的方式,比如==,reflect.DeepEqual(),cmp.Equal()等也是经常容易混淆的,这么多种对比方式,适用场景和优缺点都有哪些呢?今天我们来具体总结一下,感兴趣的小伙伴们可以参考借鉴
    2022-11-11
  • Go语言字符串基础示例详解

    Go语言字符串基础示例详解

    这篇文章主要为大家介绍了Go语言字符串基础的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • 使用Go语言实现一个二维码生成器

    使用Go语言实现一个二维码生成器

    二维码作为信息传递的载体,已经广泛应用在支付、营销、门票、WiFi 分享等场景中,Go 标准库虽然没有直接支持二维码,但通过第三方库我们可以非常方便地实现一个二维码生成器工具,这一篇我们就来带你一步一步完成一个二维码生成器,需要的朋友可以参考下
    2025-09-09
  • Go初学者踩坑之go mod init与自定义包的使用

    Go初学者踩坑之go mod init与自定义包的使用

    go mod是go的一个模块管理工具,用来代替传统的GOPATH方案,下面这篇文章主要给大家介绍了关于Go初学者踩坑之go mod init与自定义包的使用,需要的朋友可以参考下
    2022-10-10
  • 基于Go语言开发一个JSON格式校验工具

    基于Go语言开发一个JSON格式校验工具

    在日常开发中,经常会遇到需要校验 JSON 格式是否正确的场景,如果 JSON 格式不正确,系统往往会报错甚至崩溃,因此开发一个 命令行 JSON 格式校验工具 非常实用,所以本文给大家介绍了如何基于Go语言开发一个JSON格式校验工具,需要的朋友可以参考下
    2025-09-09
  • 深入解析Go语言的io.ioutil标准库使用

    深入解析Go语言的io.ioutil标准库使用

    这篇文章主要介绍了Go语言的io.ioutil标准库使用,是Golang入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • 一文带你掌握Golang中的值类型和引用类型

    一文带你掌握Golang中的值类型和引用类型

    在 Golang 中,数据类型可以分为两大类:值类型(Value Types)和引用类型(Reference Types),理解这两种类型的区别对于理解 Golang 中的数据传递和内存管理是很重要的,下面就跟随小编一起深入了解一下它们吧
    2024-01-01
  • Go语言并发模型的2种编程方案

    Go语言并发模型的2种编程方案

    这篇文章主要介绍了Go语言并发模型的2种编程方案,本文给出共享内存和通过通信的2种解决方案,并给出了实现代码,需要的朋友可以参考下
    2014-10-10

最新评论