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的更多相关文章

  1. golang gin框架中实现一个简单的不是特别精确的秒级限流器

    起因 看了两篇关于golang中限流器的帖子: Gin 开发实践:如何实现限流中间件 常用限流策略--漏桶与令牌桶介绍 我照着用,居然没效果-- 时间有限没有深究.这实在是一个很简单的功能,我的需求是 ...

  2. 在gin框架中使用JWT

    在gin框架中使用JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下. 什么 ...

  3. gin框架中的路由

    基本路由 gin框架中采用的路由库是基于httrouter做的 地址为:https://github.com/julienschmidt/httprouter httprouter路由库 点击查看代码 ...

  4. gin框架中请求路由组的使用

    1. gin框架中可以使用路由组来实现对路由的分类 package main import "github.com/gin-gonic/gin" func main() { rou ...

  5. 【解决了一个小问题】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 ...

  6. gin框架中中间件的编写与使用

    概念 一个完整的系统可能包括鉴权认证.权限管理.安全检查.日志记录等多维度的系统支持. 中间件位与服务器和实际业务处理程序之间,其含义就相当于在请求和具体的业务处理逻辑之间增加某些操作,这种以额外增加 ...

  7. golang gin框架中实现大文件的流式上传

    一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式 ...

  8. gin框架中的参数验证

    结构体验证 用gin框架的数据验证,可以不用解析数据,减少if else,会简洁许多. 处理请求方法 func structValidator(context *gin.Context) { var ...

  9. gin框架中请求参数的绑定与多数据格式处理

    package main import ( "fmt" "github.com/gin-gonic/gin" ) // gin框架提供给开发者表单实体绑定的功能 ...

  10. gin框架中使用jwt

    生成解析token 如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一.JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本 ...

随机推荐

  1. [ERROR] Error executing Maven. [ERROR] 1 problem was encountered while building the effective settings

    原因: maven 的配置文件 setting.xml 有错. 比如在配置文件中多了一行: 导致配置文件的格式不正确.

  2. 火山引擎DataTester:一个爆款游戏产品,是如何用A/B测试打磨出来的?

    随着国内游戏用户数量趋于饱和,中国游戏产业也从高速成长期逐渐转型,市场成熟度提升,竞争趋于精细化. 随着游戏出海以及私域流量运营的挑战,游戏企业对数据分析的使用需求和依赖度进一步提高.而在游戏研发立项 ...

  3. 用 Java?试试国产轻量的 Solon v1.10.7

    Java 国产的轻量级应用开发框架.可用来快速开发 Java 应用项目.主框架仅 0.1 MB.Helloworld: @Controller public class App { public st ...

  4. NOKOV度量光学动作捕捉系统工作流程

    如果你对影视.动画或者游戏有一定关注,相信你一定听说过"动作捕捉".事实上,无论是屏幕中的战场,还是真实的军事领域,从2K游戏中的虚拟球员,到医疗.康复.运动领域的专业研究:从机器 ...

  5. 机器学习的线性代数(Python 版)

    线性代数是数学的分支学科,涉及矢量.矩阵和线性变换.它是机器学习的重要基础,从描述算法操作的符号到代码中算法的实现,都属于该学科的研究范围. 虽然线性代数是机器学习领域不可或缺的一部分,但二者的紧密关 ...

  6. 0x62 图论-最小生成树

    A题:走廊泼水节 链接:https://ac.nowcoder.com/acm/contest/1056/A 题目描述 给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小 ...

  7. Win10中docker的安装与使用

    1.docker的安装 环境准备 Docker for Windows是一个Docker Community Edition(CE)应用程序.Docker for Windows安装包包含了在Wind ...

  8. git branch 分支命令图文详解

    https://blog.csdn.net/wangdawei_/article/details/124556712 git branch 分支命令详解git branch (查看本地分支)git b ...

  9. webpack4.0+简要

    一.webpack简介 webpack 是当下十分流行的一款静态模块打包工具,将JS.CSS.HTML.图片等各种静态资源视为一个个模块,通过一个或者多个入口文件通过解析依赖关系生成一个依赖图,最终打 ...

  10. df -h与df -i的区别

    一. df命令详解: linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息 -a 全部文件系统列表 -h ...