You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:36:02