【记录一个问题】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)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本 ...
随机推荐
- gitblit 不使用远程头像的方法
gitblit 安装非常简单,使用也很方便,由于我初次使用,遇到一个小问题,头像加载不出来,很影响系统的速度,网上找了很久,终于找到了解决办法. 1.仓库分组:创建仓库设定名称时录入:groupNam ...
- protobuf安装、编译和使用
protobuf使用简单示例 一.安装 首先下载protobuf的安装包,我这里使用的是protobuf-cpp-3.21.5.tar.gz 解压安装包 tar -xzf protobuf-cpp-3 ...
- Codeforece : 1360C. Similar Pairs(水题)
https://codeforces.com/contest/1360/problem/C We call two numbers xx and yy similar if they have the ...
- AtCoder ABC 164 (D~E)
比赛链接:Here ABC水题, D - Multiple of 2019 (DP + 分析) 题意: 给定数字串S,计算有多少个子串 \(S[L,R]\) ,满足 \(S[L,R]\) 是 \(2 ...
- vivo 全球商城:从 0 到 1 代销业务的融合之路
代销是 vivo 商城已经落地的成熟业务,本文提供给各位读者 vivo 商城代销业务中两个异构系统业务融合的对接经验和架构思路. 一.业务背景 近两年,内销商城业务的发展十分迅速,vivo 商城系统的 ...
- P1854-DP【绿】
首先通过这道题我收获了一个知识,那就是deque可以直接赋值,作用和vector类似就是复制一个一摸一样的deque,很好用,越来越发现deque眉清目秀了起来.以后deque可能是我最常用的STL结 ...
- VS2019 16.8下载安装
昨天,想升级到 net5版本,发现在vs2019上始终发现不了它,考虑好几个小时,终于狠下心,把vs2019卸载了,重新装一次.耗费了一个晚上,先将安装过程写下来,以供参考 第一步, 到 微软官网 h ...
- Linux: CPU C-states
0. Overview There are various power modes of the CPU which are determined based on their current usa ...
- 2023强网拟态crypto-一眼看出
1.题目信息 一眼看穿 查看代码 from Crypto.Util.number import * from secret import flag import gmpy2 flag=b'' r = ...
- 在TypeScript项目中搭配Axios封装后端接口调用
前言 本来是想发 next.js 开发笔记的,结果发现里面涉及了太多东西,还是拆分出来发吧~ 本文记录一下在 TypeScript 项目里封装 axios 的过程,之前在开发 StarBlog-Adm ...