编辑:由于@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 Callback
和Invoke
时,将包导入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 )
}
答案 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类型