【记录一个问题】gin框架中,ShouldBindUri()函数依赖特定版本编译器,更换库的版本号后导致panic
panic发生在这一行:
uriBindErr = c.ShouldBindUri(methodLastInParam.Interface())
导致panic的堆栈信息如下:
err=reflect: call of reflect.Value.Interface on zero Value stack=goroutine 3301 [running]:
runtime/debug.Stack()
/usr/local/go/src/runtime/debug/stack.go:24 +0x88
git.xxxx.com/kit/web/middleware.Recovery.func1.1(0x14001c5ea00)
/Users/ahfuzhang/go/pkg/mod/kit@v0.8.6/web/middleware/recovery.go:37 +0x3bc
panic({0x1062731a0, 0x140011d45d0})
/usr/local/go/src/runtime/panic.go:1038 +0x21c
reflect.valueInterface({0x0, 0x0, 0x0}, 0x1)
/usr/local/go/src/reflect/value.go:1369 +0x178
reflect.Value.Interface(...)
/usr/local/go/src/reflect/value.go:1364
github.com/gin-gonic/gin/binding.(*defaultValidator).ValidateStruct(0x10776c9b0, {0x1061a28a0, 0x0})
/Users/ahfuzhang/go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/binding/default_validator.go:45 +0x124
github.com/gin-gonic/gin/binding.(*defaultValidator).ValidateStruct(0x10776c9b0, {0x140003cfd00, 0x1400062bde8})
/Users/ahfuzhang/go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/binding/default_validator.go:45 +0x140
github.com/gin-gonic/gin/binding.validate(...)
/Users/ahfuzhang/go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/binding/binding.go:117
github.com/gin-gonic/gin/binding.uriBinding.BindUri({}, 0x140010d49c0, {0x140003cfd00, 0x1400062bde8})
/Users/ahfuzhang/go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/binding/uri.go:17 +0x98
github.com/gin-gonic/gin.(*Context).ShouldBindUri(0x14001c5ea00, {0x140003cfd00, 0x1400062bde8})
/Users/ahfuzhang/go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/context.go:700 +0x60
git.xxxx.com/kit 这个依赖库,我从版本0.7升级到0.8后,http请求这里一定发生panic
这里说明几个问题:
1.反射的某些信息,依赖于特定编译器版本,特定库版本的元数据信息。当版本更换后,反射的信息就不再准确了。
由此导致了运行期的panic.
2.哪些看起来酷炫的反射技巧,为后来的版本升级带来了隐患。
3.编译期类型检查好过于运行期的动态分配。
建议还是开发同学老老实实传入函数名和类型名,如果嫌难写的话,一方面可以通过框架封装来减少代码量,另一方面可以考虑代码生成的方法。
【记录一个问题】gin框架中,ShouldBindUri()函数依赖特定版本编译器,更换库的版本号后导致panic的更多相关文章
- golang gin框架中实现一个简单的不是特别精确的秒级限流器
起因 看了两篇关于golang中限流器的帖子: Gin 开发实践:如何实现限流中间件 常用限流策略--漏桶与令牌桶介绍 我照着用,居然没效果-- 时间有限没有深究.这实在是一个很简单的功能,我的需求是 ...
- 在gin框架中使用JWT
在gin框架中使用JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下. 什么 ...
- gin框架中的路由
基本路由 gin框架中采用的路由库是基于httrouter做的 地址为:https://github.com/julienschmidt/httprouter httprouter路由库 点击查看代码 ...
- gin框架中请求路由组的使用
1. gin框架中可以使用路由组来实现对路由的分类 package main import "github.com/gin-gonic/gin" func main() { rou ...
- 【解决了一个小问题】gin框架中出现如下错误:"[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 500"
POST到数据到一条gin框架的接口后,客户端收到400错误,并且返回了业务中返回的"decode json fail". 关键代码是: func report(c *gin.Co ...
- gin框架中中间件的编写与使用
概念 一个完整的系统可能包括鉴权认证.权限管理.安全检查.日志记录等多维度的系统支持. 中间件位与服务器和实际业务处理程序之间,其含义就相当于在请求和具体的业务处理逻辑之间增加某些操作,这种以额外增加 ...
- golang gin框架中实现大文件的流式上传
一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式 ...
- gin框架中的参数验证
结构体验证 用gin框架的数据验证,可以不用解析数据,减少if else,会简洁许多. 处理请求方法 func structValidator(context *gin.Context) { var ...
- gin框架中请求参数的绑定与多数据格式处理
package main import ( "fmt" "github.com/gin-gonic/gin" ) // gin框架提供给开发者表单实体绑定的功能 ...
- gin框架中使用jwt
生成解析token 如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一.JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本 ...
随机推荐
- 破解数据匮乏现状:纵向联邦学习场景下的逻辑回归(LR)
摘要:主要介绍了华为云可信智能计算服务(TICS)采用的纵向联邦逻辑回归(LR)方案. 本文分享自华为云社区<纵向联邦学习场景下的逻辑回归(LR)>,作者: 汽水要加冰. 海量训练数据是人 ...
- 万字长文|Hadoop入门笔记(附资料)
大数据迅速发展,但是Hadoop的基础地位一直没有改变.理解并掌握Hadoop相关知识对于之后的相关组件学习有着地基的作用.本文整理了Hadoop基础理论知识与常用组件介绍,虽然有一些组件已经不太常用 ...
- 超90万个K8S实例可被发现暴露在公网上,14%位于中国
翻译: SEAL安全 原标题: Over 900,000 Kubernetes instances found exposed online 原文链接: https://www.bleepingcom ...
- [kuangbin] 专题13 基础计算几何 题解 + 总结
kuangbin带你飞:点击进入新世界 [kuangbin] 专题7 线段树 题解 + 总结:https://www.cnblogs.com/RioTian/p/13413897.html kuang ...
- 活动回顾|阿里云 Serverless 技术实战与创新广州站回放&PPT下载
7月8日"阿里云 Serverless 技术实战与创新"广州站圆满落幕.活动受众以关注Serverless 技术的开发者.企业决策人.云原生领域创业者为主,活动形式为演讲.动手实操 ...
- 淘宝flexible.js源码分析
下面三种情况都会刷新页面,都会触发load事件. 1.a标签的超链接. 2.F5或者刷新按钮(强制刷新) 3.前进后退按钮 但是火狐中,有个特点,有个"往返缓存",这个缓存中不仅保 ...
- centos 安装python3导致yum报错
centos yum报错 File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: 报错: 报错一: File " ...
- R语言—数据基础及练习
## 创建leadership数据框 manager <- c(1,2,3,4,5) date <-c("10/24/08","10/28/08", ...
- c# 创建一个只接收消息的窗口
/// <summary> /// WM_COPYDATA消息,进程间传输信息专用结构 /// </summary> public struct COPYDATASTRUCT ...
- 海思Hi35xx 通过uboot查看flash指定地址的数据
前言 在实际应用中有遇到过设备放置一段时间后设备不能启动的问题,uboot 完全没有响应,类似于flash中的数据被擦洗掉一样. 网上有介绍说是nandflash 不稳定,高温或是静电会导致nan ...