go - 使用以 C 类型作为参数的导出函数类型时出现问题

标签 go cgo

编辑:感谢@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 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 )
}

最佳答案

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

将您的代码更改为:

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/

相关文章:

go - 导入由 cython 生成的 c 共享库以与 cgo 一起使用

json - go 中的 ZeroMQ 不会打印我从 PULL 套接字接收到的 json 消息字节

Go——优雅地处理多个错误?

multithreading - 写入CSV时如何解决 “short write”错误

c - CGO对“TIFFGetField”的 undefined reference

go - 调用需要 sockaddr 的 C 函数

c++ - 如何将 CGO 用于具有条件内联函数的头文件?

c++ - 使用Go + SWIG + C++代码清理内存管理

go - VSCode + Go 不断切换 go.mod 依赖项,设置 root 所有权

go - httprouter传入很多中间件函数