【记录一个问题】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.编译期类型检查好过于运行期的动态分配。
建议还是开发同学老老实实传入函数名和类型名,如果嫌难写的话,一方面可以通过框架封装来减少代码量,另一方面可以考虑代码生成的方法。
分类:
golang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异