使用C类型作为参数的导出函数类型时遇到问题

时间:2015-06-28 12:08:50

标签: go cgo

编辑:由于@Not_a_Golfer

,更改了标题以更好地反映问题

我一直在试验Go而无法弄清楚这个问题。

以下工作正常包含在主包中:

// Define a callback-function type, and define an invoker for it
type Callback func(i C.int, d C.double)
func Invoke(cb Callback, i C.int, d C.double) {
        cb(i, d)
}
//... then define my callback and pass it into the invoker
func foo(i C.int, d C.double) {
        fmt.Printf("i %d d %f\n", i, d)
}
func main() {
        Invoke(foo, 2, 2.2)
}

但是当我在包中定义type CallbackInvoke时,将包导入main并调用mypkg.Invoker(foo, 2, 2.2)我收到以下构建错误:

src/hello/hello.go:9: cannot convert foo (type func(C.int, C.double)) to type mypkg.Callback

编辑:这是hello包的主要代码。我构建了所有内容,以便我可以使用go命令进行构建/安装:

package main
import "C"
import "mypkg"
import "fmt"
func foo(i C.int, d C.double) {
        fmt.Printf("i %d d %f\n", i, d)
}
func main() {
        mypkg.Invoke( mypkg.Callback(foo), 2, 2.2 )
}

有人知道从包中导出的类型是否有什么特别之处?我在参数中使用C类型,因为最终这将是一个C库的包装器,我只是想确保C类型不是将我的回调函数与回调类型匹配的问题的一部分。

这是包裹代码:

package mypkg
import "C"
import "fmt"
type Callback func(i C.int, d C.double)
func Invoke(cb Callback, i C.int, d C.double) {
        fmt.Println("Calling cb\n")
        cb( i, d )
}

1 个答案:

答案 0 :(得分:0)

它们实际上是不同的类型!

将您的代码更改为:

package main

import "C"
import "mypkg"

func main() {
    a := 1

    mypkg.Inc(C.int(a))
}

MYPKG:

package mypkg

import "C"

func Inc(a C.int) C.int {
    return a + 1
}

编译第一个包会出错: ./test.go:9:不能在mypkg.Inc的参数中使用C.int(a)(类型C.int)作为mypkg.C.int类型