Golang PHP 数据绑定示例分析

 更新时间:2023年08月17日 09:59:41   作者:叶剑飞雪  
这篇文章主要为大家介绍了Golang PHP 数据绑定示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

强类型语言

数据绑定

在强类型语言中,绑定参数分好几种类型。拿最使用广泛的Gin web 框架介绍

1、Bind 和 ShouldBind

Gin 的 Context 为请求数据绑定提供了两大类方法:在命名上以 Bind 为前缀和以 ShouldBind区分。这两大类方法在行为上有些差异。

类型描述
must条件必须要满足
should条件应该满足

Bind 方法会自动将 http status 设置为 400。而且不会返回更多的信息。由于存在,错误处理复杂,限制较多(仅仅支持常见类型),验证规则限制简单,可能存在安全风险等等在日常开发中几乎不建议使用bind 来绑定数据

ShouldBind、ShouldBindJSON 这些方法的区别是前者会自动根据 Header 头确定使用什么绑定器,如果团队内开发规范里约定了请求 Content-Type 都是 JSON 的话,直接选用后者更为合理。
在实际开发中,ShouldBind 自动根据Header 头确定使用什么绑定器使用最多。因为团队的约定对新加入的团队的人来说没看到约定的情况下,容易出现代码不兼容的问题。

var request struct {
  Email string `form:"email" binding:"required"`
  Name  string `form:"name" binding:"required"`
}
// ShouldBind 常规绑定也可以兼容post get json 参数
if err := ctx.ShouldBind(&request); err != nil {
  core.Response(ctx, gin.H{}, err)
  return
}
// Content-Type 都是 JSON 的话,对于强类型语言来说,使用下面这段更合理,一般情况还是用上面这种。
if err := ctx.ShouldBindJson(&request); err != nil {
  core.Response(ctx, gin.H{}, err)
  return
}

2、单次绑定和多次绑定request body 数据

有了上面的绑定基础情况下,小编遇到了这样的一个问题。权限验证中间件,在接收参数的时候使用的下面代码的接收参数的方式。接口的请求参数是Content-Type 都是 JSON 的类型的。

message := ctx.PostForm("message")
ids := ctx.QueryMap("ids")
message := ctx.GetQuery("message")

此时此刻,为了让接口绑定参数和中间件绑定参数,就会有二次绑定的数据的问题。小编楞是找了半天,原来强类型语言,几乎对类型都有做区分。不管是json get post request 类型每种类型都做了区分,连二次绑定都做了区分,不得不说,为了性能牺牲编写代码的体验。所以关键来了

无论是 Bind 还是 ShouldBind 类的绑定方法,都只能读取一次请求体进行绑定

可以使用ShouldBindBodyWith 来实现二次及多次绑定。那问题又来了,使用了ShouldBindBodyWith 绑定从一个参数被绑定开始,后面的绑定都得使用ShouldBindBodyWith 来绑定,有这样的限制才能实现多次绑定

if err := ctx.ShouldBindBodyWith(&request,binding.JSON); err != nil {
  core.Response(ctx, gin.H{}, err)
  return
}

到了这里基本上对参数绑定有了一定的了解。不同类型需要相互转换,不同的的场景需要不同的方法来实现。相对于弱类型语言PHP来说,不管三七二一,一键全部接收,不管什么类型,一次绑定还是多次绑定也好,照单全收,这样的处理也间接导致弱类型语言在底层处理上需要兼容各种类型,性能也相对于强类型语言编译需要更多的内容空间和消耗更多的CPU资源。

3、通用类型绑定

在强类型语言中,接收参数的时候,常用结构体来绑定数据类型。每种结构体定义一种类型。而且首字母要大写。

type request struct {
  Email string `form:"email" binding:"required"`
  Name  string `form:"name" binding:"required"`
  Age   int     `form:"age" binding:"required"`
}

那么问题来了,要接收数据格式为json 数据格式怎么办。貌似单一的数据string int 等数据格式都不能满足了,需要嵌套结构体如下:

type Grouping struct {
    ID          int         `json:"id"`
    Remark      string      `json:"remark" default:""`
}
type Group struct {
    Test1   []*Grouping `json:"test1"`
    Test2   Grouping    `json:"test2"`
    Test3   string      `json:"test3"`
    Test4   int         `json:"test4"`
}

那么问题又来了,这种类型是json 格式固定的情况下,那么需求有变动,就得更新代码新增结构体字段。增加一个结构体字段,就得重新编译一次。那没有接收通用类型的字段值。

接下来 interface 类型就派上用场了。interface 类型为通用类型,MySQL 数据库没有这种类型。还需要将interface 类型转成 json,string,int 这样的类型才能保存。所以在接收通用数据参数格式的时候,得借助MySQL第三方扩展库在标识,接收通用类型是 text string 还是json 类型

type UserGroupTask struct {
    Test1  interface{} `json:"test1" form:"test1" gorm:"type:'json'"`
}

通过标识 gorm 标识,interface 类型为json。这样在shouldBindJSON 的时候,才能识别出是JSON 格式。

总结

上面介绍了强类型语言,需要对字段类型做转化、数据绑定类型指定等,在弱类型语言中在底层封装好了。
留下一个疑问,上面的代码接收通用格式,怎么在尽可能少写结果体的前提下,把json 格式的参数取出来做判断后,在入到数据库里去呢。

更多关于Golang PHP 数据绑定的资料请关注脚本之家其它相关文章!

相关文章

  • 基于Go语言实现高性能文件上传下载系统

    基于Go语言实现高性能文件上传下载系统

    在Web应用开发中,文件上传下载是一个非常常见的需求,本文将介绍如何使用Go语言实现一个安全、高效的本地文件存储系统,感兴趣的小伙伴可以了解下
    2025-03-03
  • Go中的函数选项模式(Functional Options Pattern)详解

    Go中的函数选项模式(Functional Options Pattern)详解

    在 Go 语言中,函数选项模式是一种优雅的设计模式,用于处理函数的可选参数,本文将对其进行讲解,准备好了吗,快跟随着本文一探究竟吧
    2023-06-06
  • Go语言中nil判断引起的问题详析

    Go语言中nil判断引起的问题详析

    这篇文章主要给大家介绍了关于Go语言中nil判断引起问题的相关资料,nil 是Go语言中一个预定义好的标识符,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-06-06
  • Go语言中Recover机制的使用

    Go语言中Recover机制的使用

    Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下
    2025-06-06
  • golang的强制类型转换实现

    golang的强制类型转换实现

    这篇文章主要介绍了golang的强制类型转换实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Go语言实现Sm2加解密的示例代码

    Go语言实现Sm2加解密的示例代码

    本文主要介绍了Go语言实现Sm2加解密的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Go协程的底层原理及分析

    Go协程的底层原理及分析

    文章解释了操作系统中的进程、线程和协程的概念及其区别,并详细描述了Go语言中协程的工作原理和调度机制,包括G-M-P模型、抢占式调度、基于信号的抢占式调度等
    2026-05-05
  • Go接口构建可扩展Go应用示例详解

    Go接口构建可扩展Go应用示例详解

    本文深入探讨了Go语言中接口的概念和实际应用场景。从基础知识如接口的定义和实现,到更复杂的实战应用如解耦与抽象、多态、错误处理、插件架构以及资源管理,文章通过丰富的代码示例和详细的解释,展示了Go接口在软件开发中的强大功能和灵活性
    2023-10-10
  • golang中进行条件编译的示例详解

    golang中进行条件编译的示例详解

    条件编译顾名思义就是在编译时让代码中的一部分生效或者失效,从而控制编译时的代码执行路径,进而影响编译出来的程序的行为,下面我们就来看看如何在golang中进行条件编译吧
    2025-03-03
  • golang中使用aes加密的操作方法

    golang中使用aes加密的操作方法

    AES是一种对称加密算法,适用于加密敏感数据,通过上述方法,可在 Golang中实现AES加密/解密功能,本文给大家介绍golang中使用aes加密的操作方法,感兴趣的朋友跟随小编一起看看吧
    2025-10-10

最新评论