【记录一个问题】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.编译期类型检查好过于运行期的动态分配。
建议还是开发同学老老实实传入函数名和类型名,如果嫌难写的话,一方面可以通过框架封装来减少代码量,另一方面可以考虑代码生成的方法。
浙公网安备 33010602011771号