GO 和C 的相互调用(2)-go动态库的C语言回调函数

本文介绍了一个用于在C/C++程序中调用Go程序的库,并演示了如何在Go库函数中回调C语言的函数。通过具体的代码实例,展示了如何构建和使用这个跨语言调用的桥梁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了在C/C++ 程序中调用Go 程序, 编写了go的程序库,那么在库函数中如何调用C 语言的回调函数呢?我们尝试一下。

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef void (*callback)(void *,int);
extern void c_callback (void *,int);
extern callback _cb;
*/
import "C"
import (
//	"encoding/json"
	"unsafe"
)

func funccallback(gostring string,goint int) {
	var cmsg *C.char = C.CString(gostring)
	var ivalue C.int = C.int(len(gostring))
	defer C.free(unsafe.Pointer(cmsg))
	C.c_callback(unsafe.Pointer(cmsg),ivalue)
}

//export register_callback
func register_callback(p C.callback) {
	C._cb = p;
	return
}

//export test_callback
func test_callback() {
	funccallback("hello,this is func callback.",123)
}

func main() {
}

对C开放了两个函数 register_callback 和 test_callback

go库函数通过一个桥接函数回调 C程序中的函数

package main

/*
#include <stdio.h>

typedef void (*callback)(void *,int);

callback _cb;

void c_callback(void* p,int i)
{
	_cb(p,i);
}
*/
import "C"

编译go 程序库

go build -o libcallback.so  -buildmode=c-shared libcallback.go bridge.go 

有一点没有搞明白,为什么不能将bridge.go 的桥接函数放到libcallback.go 中,而需要独立出来一个文件bridge.go?

 C 主程序

#include <stdio.h>
#include "libcallback.h"

void gocallback(void* s,int len) {
     printf("raw data: %s\n",(char *)s);
}

int main() {
    // 注册回调
    register_callback(gocallback);
    
    // 测试回调
    test_callback();
}

编译

 gcc -o testcallback main.c ./libcallback.so 

运行结果

$ ./testcallback
raw data: hello,this is func callback.

程序的调用关系

灰色为Go 的函数,红色为C语言的函数,Call _cb 存放回调函数的指针。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值