如何在Go中向C代码传递函数指针

如何在Go中向C代码传递函数指针,go,cgo,Go,Cgo,我想编写一个用于处理视频的小型go应用程序,并决定使用这个库,它是go的FFmpeg绑定。但是,它不支持直接从内存读取视频。作为一种解决方法,我决定直接调用C函数 我要调用的函数的签名如下 AVIOContext*avio\u alloc\u上下文( 无符号字符*缓冲区, int缓冲区大小, int write_标志, 无效*不透明, int(*读取数据包)(无效*不透明,uint8*buf,int buf大小), int(*写入数据包)(无效*不透明,uint8*buf,int buf大小),

我想编写一个用于处理视频的小型go应用程序,并决定使用这个库,它是go的FFmpeg绑定。但是,它不支持直接从内存读取视频。作为一种解决方法,我决定直接调用C函数

我要调用的函数的签名如下

AVIOContext*avio\u alloc\u上下文(
无符号字符*缓冲区,
int缓冲区大小,
int write_标志,
无效*不透明,
int(*读取数据包)(无效*不透明,uint8*buf,int buf大小),
int(*写入数据包)(无效*不透明,uint8*buf,int buf大小),
int64_t(*寻道)(无效*不透明,int64_t偏移,int何处));
我写的go代码称之为-

打包视频
//#包括
输入“C”
进口(
“字节”
“github.com/giorgisio/goav/avformat”
“github.com/giorgisio/goav/avutil”
“不安全”
)
func解码流(数据*字节.缓冲区){
缓冲区大小:=8192
formatContext:=avformat.AvformatAllocContext()
缓冲区:=(*C.uchar)(avutil.AvMalloc(uintpttr(bufferSize)))
ioContext:=C.avio\u alloc\u context(
缓冲器
C.int(缓冲区大小),
C.int(0),
不安全。指针(数据),
&[0]字节{},
&[0]字节{},
&[0]字节{},

)//运行时错误实际上是在抱怨
不安全的.Pointer(data)
参数。
bytes.Buffer
类型有内部(Go)指针,如果这些指针指向本身包含Go指针的to Go对象,cgo不允许将指针传递到C

cgo文档中详细介绍了这些规则:


简短的总结是,Go垃圾收集器需要知道何时修改Go指针。Go编译器确保编译后的代码正确地通知垃圾收集器,但C编译器不知道如何这样做。因此,为了防止GC问题,cgo根本不允许这样传递指针。

运行时错误实际上是抱怨
不安全的.Pointer(data)
参数。
bytes.Buffer
类型有内部(Go)指针,如果指针指向本身包含Go指针的to Go对象,cgo不允许将指针传递给C

cgo文档中详细介绍了这些规则:


简短的总结是,Go垃圾收集器在修改Go指针时需要注意。Go编译器确保编译后的代码正确地通知垃圾收集器,但C编译器不知道如何这样做。因此,为了防止GC问题,cgo根本不允许这样传递指针。

正确!但我如何获得aw是的,并实际调用函数?太好了!我会研究它!你找到解决方案了吗?希望得到更多的信息正确!但我如何摆脱它并实际调用函数?太好了!我会研究它!你找到解决方案了吗?希望得到更多的信息