go - Reflect Value.Interface() panic: bad indir on CGo type after v1.15.4
问题描述
我正在使用一个名为 GEOS 的 C 库,它提供了一个 C 支持的实现来处理几何操作。在某些反射操作期间使用了包含此 C 类型的结构,但在升级到 Go v1.15.4(或之后的任何版本)时,这会导致恐慌。
我已经隔离了这个问题,看起来当使用反射Type
创建一个新的反射Value
时,随后的调用Interface()
结果是panic: bad indir
:
var test *C.GEOSGeometry
reflectType := reflect.ValueOf(test).Type().Elem()
value := reflect.New(reflectType)
// Panics in 1.15.4+
value.Interface()
实际的恐慌来自func packEface
内部reflect/value.go
发生以下情况:
switch {
case ifaceIndir(t):
if v.flag&flagIndir == 0 { // here v.flag = 22 and flagIndir = 128
panic("bad indir")
}
...
看起来我在这里做的事情是不正确的,还是更有可能这是引入的错误1.15.4
?
解决方案
经过进一步调查,在 C 代码中,GEOSGeometry
被定义为不完整的结构类型:
typedef struct GEOSGeom_t GEOSGeometry;
开发人员创建了一个补丁,以便在更好的地方失败,而不是在调用时随机恐慌Interface()
推荐阅读
- android - 颤振:输入“未来”
' 不是类型转换中类型 'bool' 的子类型 - flutter - 为什么不能在 Dart 的构造函数体中初始化不可为空的字段?
- phpmyadmin - 将表格数据从一个 joomla 站点传输到另一个
- parceljs - parceljs 波旁变压器-sass 无法构建
- arduino - 10 秒后 Arduino MP3 暂停
- c# - 能够使用 ngrok 但不能使用 Azure url 创建 Microsoft Graph 订阅
- amazon-web-services - 尝试创建 Fargate 配置文件时不断出错
- android - 将通知设置为在某个用户事件时触发
- monetdb - 在合并的远程表上运行分布式连接查询
- json - 这有什么问题?我正在尝试制作我的世界起源,但它不起作用