无法将unsafe.Pointer(指向C函数)作为函数调用

时间:2017-05-17 09:00:13

标签: go cgo

我尝试使用相同的签名调用C函数,他们使用2个int参数。并且在编译期间出现此错误cannot call non-function f (type unsafe.Pointer)

package main

/*
int add(int a, int b) {
  return a+b;
}
int sub(int a, int b) {
  return a-b;
}
*/
import "C"
import (
    "fmt"
    "unsafe"
)

func main() {
    a := C.int(1)
    b := C.int(2)
    fx := make([]unsafe.Pointer, 2)
    fx[0] = C.add
    fx[1] = C.sub
    for _, f := range fx {
        fmt.Printf("Result: %d\n", f(a, b))
    }
}

现在我正在使用go函数处理wrap C函数并将go函数添加到切片中而不是像这样

package main

/*
int add(int a, int b) {
  return a+b;
}
int sub(int a, int b) {
  return a-b;
}
*/
import "C"
import (
    "fmt"
)

func add(a, b int) int {
    return (int)(C.add(C.int(a), C.int(b)))
}

func sub(a, b int) int {
    return (int)(C.sub(C.int(a), C.int(b)))
}

func main() {
    fx := [](func(int, int) int){
        add, sub,
    }
    for _, f := range fx {
        fmt.Printf("Result: %d\n", f(1, 2))
    }
}

有没有办法从unsafe.Pointer调用C函数,我使用的是GO 1.8.1 Linux

1 个答案:

答案 0 :(得分:0)

根据Go references to C,我可以解决我的问题。

  

目前,不支持调用C函数指针   可以声明包含C函数指针的Go变量并传递它们   Go和C之间来回.C代码可以调用函数指针   从Go获得。

看起来我必须为调用C函数指针创建bridge function

package main

/*
int add(int a, int b) {
  return a+b;
}
int sub(int a, int b) {
  return a-b;
}

typedef int(*math_fp)(int, int);

const int len_operator = 2;

math_fp math_operators[2] = {
    add, sub
};

int do_math(math_fp op, int a, int b) {
    return op(a, b);
}
*/
import "C"
import (
    "fmt"
)

func main() {
    var fnCnt C.int = 2
    var i C.int
    for i = 0; i < fnCnt; i++ {
        op := C.math_fp(C.math_operators[i])
        fmt.Printf("Result: %d\n", C.do_math(op, 1, 2))
    }
}

返回预期结果

$ go run src/test.go 
Result: 3  
Result: -1