新闻详情

新闻详情

首页 / 资讯中心 / 详情

Gin 怎么给自定义类型实现 encoding.TextUnmarshaler 并通过 parser 标签参与绑定

发布时间:2026/9/10 15:19:26来源:尧图网络
Gin 怎么给自定义类型实现 encoding.TextUnmarshaler 并通过 parser 标签参与绑定
Gin 怎么给自定义类型实现 encoding.TextUnmarshaler 并通过 parser 标签参与绑定【免费下载链接】ginGin is a high-performance HTTP web framework written in Go. It provides a Martini-like API but with significantly better performance—up to 40 times faster—thanks to httprouter. Gin is designed for building REST APIs, web applications, and microservices.项目地址: https://gitcode.com/GitHub_Trending/gi/gin在 Gin 项目里写接口时常见一种参数客户端传的是字符串比如2000-01-01这样的日期、十六进制值、自定义 ID但结构体字段希望存放转换后的自定义类型值。Gin 的form/uri默认绑定只处理内置的常见类型要让自定义类型用自己的解析逻辑参与绑定做法是给该类型实现标准库的encoding.TextUnmarshaler接口并在字段标签上加parserencoding.TextUnmarshaler。本文基于 docs/doc.md 中 Bind custom unmarshaler 一节的完整示例给出从实现接口到用 curl 验证的全过程。准备条件一个已引入github.com/gin-gonic/gin的 Go 项目接口通过form或uri标签绑定参数示例中使用ctx.BindQueryGET 查询参数走form标签。第一步给自定义类型实现 UnmarshalText以文档中的Birthday类型为例把请求值里的-替换成/package main import ( encoding strings github.com/gin-gonic/gin ) type Birthday string func (b *Birthday) UnmarshalText(text []byte) error { *b Birthday(strings.Replace(string(text), -, /, -1)) return nil } var _ encoding.TextUnmarshaler (*Birthday)(nil) //assert Birthday implements encoding.TextUnmarshaler几个必须注意的点签名固定为UnmarshalText(text []byte) error且示例用的是指针接收者——gin 在绑定时会把字段的地址作为encoding.TextUnmarshaler来断言最后一行var _ encoding.TextUnmarshaler (*Birthday)(nil)是编译期断言类型没实现接口时直接编译报错不必等运行时才发现标签不生效请求里的原始值例如2000-01-01会作为text传进来转换逻辑包括需要时的校验都写在UnmarshalText内。第二步在字段标签里加 parser 选项类型实现了接口还不够gin 只在标签声明了 parser 时才会调用UnmarshalTextvar request struct { Birthday Birthday form:birthday,parserencoding.TextUnmarshaler Birthdays []Birthday form:birthdays,parserencoding.TextUnmarshaler collection_format:csv BirthdaysDefault []Birthday form:birthdaysDef,default2020-09-01;2020-09-02,parserencoding.TextUnmarshaler collection_format:csv }parserencoding.TextUnmarshaler写在form或uri标签的选项部分uri绑定用法相同例如uri:field,parserencoding.TextUnmarshaler客户端未传该字段时可用default提供默认值默认值同样会走UnmarshalText数组默认值用分号;分隔逗号在标签里是选项分隔符不能出现在默认值中配合collection_format:csv时客户端用逗号分隔传多个值如birthdays2000-01-01,2000-01-02。完整示例与验证下面的完整代码来自 docs/doc.md监听:8088/test接口把绑定结果直接以 JSON 返回package main import ( encoding strings github.com/gin-gonic/gin ) type Birthday string func (b *Birthday) UnmarshalText(text []byte) error { *b Birthday(strings.Replace(string(text), -, /, -1)) return nil } var _ encoding.TextUnmarshaler (*Birthday)(nil) //assert Birthday implements encoding.TextUnmarshaler func main() { route : gin.Default() var request struct { Birthday Birthday form:birthday,parserencoding.TextUnmarshaler Birthdays []Birthday form:birthdays,parserencoding.TextUnmarshaler collection_format:csv BirthdaysDefault []Birthday form:birthdaysDef,default2020-09-01;2020-09-02,parserencoding.TextUnmarshaler collection_format:csv } route.GET(/test, func(ctx *gin.Context) { _ ctx.BindQuery(request) ctx.JSON(200, request) }) _ route.Run(:8088) }说明一点文档示例把request声明在 handler 外面所有请求会复用同一个结构体实例实际接口里建议把结构体声明在 handler 内部每个请求独立绑定。启动后按文档给出的方式验证curl localhost:8088/test?birthday2000-01-01birthdays2000-01-01,2000-01-02文档展示的示例结果是{Birthday:2000/01/01,Birthdays:[2000/01/01,2000/01/02],BirthdaysDefault:[2020/09/01,2020/09/02]}核对要点Birthday和Birthdays的值都被UnmarshalText转成了/分隔形式说明 parser 标签生效BirthdaysDefault没有被请求参数覆盖但默认值2020-09-01;2020-09-02同样经过了UnmarshalText。如果响应里还是-形式说明标签没写对或类型没有实现接口此时 gin 会静默回落到默认绑定见下文。规则与边界文档和 binding/form_mapping.go 中的trySetUsingParser实现给出了这些明确行为类型没有实现encoding.TextUnmarshaler却写了parserencoding.TextUnmarshaler时gin 忽略该选项继续用默认绑定逻辑——不会报错排查时容易误以为接口没生效UnmarshalText返回 error 时gin 停止绑定并把错误返回给客户端因此可以在UnmarshalText里做参数格式校验例如 binding/form_mapping_test.go 中customUnmarshalTextType对不符合a:b:c格式的值返回invalid format反过来即使类型实现了UnmarshalText标签里不写parserencoding.TextUnmarshaler时gin 仍然走默认绑定。测试里对十六进制类型hex11不带 parser 的字段按默认 int 绑定得到十进制 11带 parser 的字段得到0x11即 17。这是为保持向后兼容而设计的也是实现了接口但转换没生效时最该先检查的地方parser 选项只作用于form/uri绑定。可选替代路径gin 的 BindUnmarshaler 接口如果类型已经实现了encoding.TextUnmarshaler但你想换一种 gin 绑定该类型的方式文档给出的例子是想改变返回的错误信息可以改用 gin 提供的binding.BindUnmarshaler接口它的方法签名是UnmarshalParam(param string) errorpackage main import ( strings github.com/gin-gonic/gin github.com/gin-gonic/gin/binding ) type Birthday string func (b *Birthday) UnmarshalParam(param string) error { *b Birthday(strings.Replace(param, -, /, -1)) return nil } var _ binding.BindUnmarshaler (*Birthday)(nil) //assert Birthday implements binding.BindUnmarshaler两个接口的优先级规则类型同时实现encoding.TextUnmarshaler和BindUnmarshaler时gin 默认使用BindUnmarshaler只有标签里显式写了parserencoding.TextUnmarshaler才会调用UnmarshalTextUnmarshalParam返回 error 时gin 同样停止绑定并把错误返回给客户端走BindUnmarshaler时字段标签不需要parser选项验证方式与上面相同curl localhost:8088/test?birthday2000-01-01birthdays2000-01-01,2000-01-02文档展示的示例结果与 TextUnmarshaler 版本一致。两条路径覆盖同一场景需要自定义解析就用parserencoding.TextUnmarshalerUnmarshalText需要定制 gin 的绑定行为尤其是错误信息用UnmarshalParam并按上面的优先级规则决定是否加 parser 标签。【免费下载链接】ginGin is a high-performance HTTP web framework written in Go. It provides a Martini-like API but with significantly better performance—up to 40 times faster—thanks to httprouter. Gin is designed for building REST APIs, web applications, and microservices.项目地址: https://gitcode.com/GitHub_Trending/gi/gin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

番外篇 | 史上最全的关于CV的一些经典注意力机制代码汇总 2026/9/10 15:56:16

番外篇 | 史上最全的关于CV的一些经典注意力机制代码汇总

前言:Hello大家好,我是小哥谈。注意力是人类认知系统的核心部分,它允许我们在各种感官输入中筛选和专注于特定信息。这一能力帮助我们处理海量的信息,关注重要的事物,而不会被次要的事物淹没。受到人类认知系统的启发,计算机科学家开发了注意力机制,这种机制模仿人类的这…

阅读更多 →
Rust 与 Chromium 集成实战:用 CXX 桥接 uwuify 改造 ResourceBundle 字符串(comprehensive-rust 综合练习全解) 2026/9/10 15:56:16

Rust 与 Chromium 集成实战:用 CXX 桥接 uwuify 改造 ResourceBundle 字符串(comprehensive-rust 综合练习全解)

Rust 与 Chromium 集成实战:用 CXX 桥接 uwuify 改造 ResourceBundle 字符串(comprehensive-rust 综合练习全解) 【免费下载链接】comprehensive-rust This is the Rust course used by the Android team at Google. It provides you the mat…

阅读更多 →
C++11高频交易框架:低延迟确定性执行实战 2026/9/10 15:56:16

C++11高频交易框架:低延迟确定性执行实战

简介:这是一套基于C11开发的工业级高频量化交易平台源码,面向具备C基础的量化开发工程师、金融系统开发者及高校高年级学生,旨在解决CTP、飞马(Femas)等主流期货/期权交易接口的快速接入与低延迟策略实现问题。资源共1…

阅读更多 →
.NET 8 + Vue RBAC权限系统:生产级中后台骨架解析 2026/9/10 15:56:16

.NET 8 + Vue RBAC权限系统:生产级中后台骨架解析

简介:这是一套开箱即用的企业级中后台权限管理系统,面向.NET与Vue全栈开发者、企业IT系统架构师及权限管理模块学习者,解决中大型项目中RBAC权限模型落地难、前后端协同开发效率低、技术栈陈旧导致维护成本高等实际问题。资源包共279个文件&a…

阅读更多 →
Python+Twilio实现高效短信通知系统实战指南 2026/9/10 15:56:16

Python+Twilio实现高效短信通知系统实战指南

1. 项目概述:PythonTwilio短信通知系统实战短信通知系统在现代业务场景中扮演着关键角色,从用户验证码发送到订单状态更新,再到紧急告警通知,几乎覆盖所有需要实时触达用户的场景。传统企业级短信网关往往需要复杂的资质审核和高昂…

阅读更多 →
InvokeAI 默认工作流(Default Workflows)机制全解析:同步原理、JSON 规范与发布校验 2026/9/10 15:53:15

InvokeAI 默认工作流(Default Workflows)机制全解析:同步原理、JSON 规范与发布校验

InvokeAI 默认工作流(Default Workflows)机制全解析:同步原理、JSON 规范与发布校验 【免费下载链接】InvokeAI Invoke is a leading creative engine for Stable Diffusion models, empowering professionals, artists, and enthusiasts to …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞