编辑:感谢@Not_a_Golfer 更改了标题以更好地反射(reflect)问题
我一直在试验 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 )
}
最佳答案
它们实际上是不同的类型!
将您的代码更改为:
package main
import "C"
import "mypkg"
func main() {
a := 1
mypkg.Inc(C.int(a))
}
我的包:
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
关于go - 使用以 C 类型作为参数的导出函数类型时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31099620/