请教一下:cgo是否支持回调?如果不支持的话,该如何实现回调功能呢?
说的是这样吗?
package main
// typedef int (*intFunc) ();
//
// int
// bridge_int_func(intFunc f)
// {
// return f();
// }
//
// int fortytwo()
// {
// return 42;
// }
import "C"
import "fmt"
func main() {
f := C.intFunc(C.fortytwo)
fmt.Println(int(C.bridge_int_func(f)))
// Output: 42
}
#1
更多评论
首先谢谢您的回答。我主要是想用Go语言来实现回调函数,对应到您的代码就是将fortytwo函数用Go语言来实现。由于cgo是不支持在C代码中调用Go代码的,所以这种方式恐怕不行。
#2
Cgo 没有不允许在C代码中调用Go代码。
下面的代码不知道能满足你的需求不?
```golang
// bar1.go
package main
import "C"
//export Fortytwo
func Fortytwo() int {
return 42
}
```
```golang
// bar2.go
package main
/*
extern int Fortytwo();
typedef int (*intFunc) ();
int bridge_int_func(intFunc f)
{
return f();
}
int callback()
{
return bridge_int_func(Fortytwo);
}
*/
import "C"
import "fmt"
func main() {
fmt.Println(int(C.callback()))
// Output: 42
}
```
编译:go build -o bar bar1.go bar2.go
#3