如何在Go语言中传递C函数指针?
解决Go中无法直接调用C函数指针的问题
Go的cgo机制不允许在Go代码里直接调用C函数指针,这就是你遇到"invalid operation: cannot call non-function fp"错误的原因。要实现Go函数接收并调用C函数指针,需要通过C层封装辅助函数来间接调用。
修改方案
在C代码中新增一个辅助函数,专门用于调用目标函数指针,然后在Go函数里调用这个辅助函数:
package main /* #include <stdio.h> typedef void (*func_t)(int); void this_works(int a, func_t f){ f(a); } void tst(int a) { printf("YAY\n"); } // 新增辅助函数:接收函数指针和参数,在C层执行调用 void call_func_t(func_t f, int arg) { f(arg); } */ import "C" func this_does_not_work(fp C.func_t) { // 通过C辅助函数间接调用传入的函数指针 C.call_func_t(fp, C.int(2)) } func main() { C.this_works(1, C.func_t(C.tst)) this_does_not_work(C.func_t(C.tst)) }
原理说明
Go代码无法直接操作C函数指针的调用逻辑,必须把调用动作交给C层处理。通过封装C辅助函数,把函数指针和参数传递到C环境中执行调用,就能绕过Go的语法限制。如果后续有其他签名的C函数指针需要处理,只需要对应新增不同的C辅助函数即可,这样就能统一封装初始化流程,减少重复代码。
内容的提问来源于stack exchange,提问作者Craftables
相关产品推荐
相关产品推荐

