// package1.go
package package1
import "C"
func Play(s *C.char) {
}
// main.go
package main
import "C"
import (
"path/to/package1"
)
func PlayMore(s *C.char) {
package1.Play(s)
}
func main() {
}
# command-line-arguments
main.go:12: cannot use s (type *C.char) as type *package1.C.char
in argument to package1.Play
似乎“C”包对于每个包都是本地的,编译器将它们视为不同的包。我试过像:
func PlayMore(s *package1.C.char) {
package1.Play(s)
}
但是这是一个语法错误。
在原始问题中,参数类型不是*C.char
。它是指向旧库中C类型的指针。
package1
有一个低级API和一个高级API:
C.xxx
个类型。C.xxx
参数或返回类型。例如,使用string
代替*C.char
。该实现准备参数,并调用低级API进行实际工作。上面的客户端代码(main
包)实际上是另一个包(package2
),可以从C调用。您可以将其视为构建在C之上的C库另一个C库,但实现是用Go编写的。例如,上面的PlayMore()
是通过//export PlayMore
在原始问题中导出的,以便可以从C调用。
当package2
需要调用旧库提供的函数时,它会调用package1
的低级API。实际上,package1
的低级API是公开的原因是允许像package2
这样的包重用它。
Trouble using exported function type with C types as parameters
答案 0 :(得分:1)
您可以导出:type ExportedType C.char
,如下工作示例代码:
package package1
import "C"
import "fmt"
type ExportedType C.char
func Play(s *ExportedType) {
fmt.Println(C.GoString((*C.char)(s)))
}
主要代码:
package main
import "C"
import (
"path/to/package1"
)
func PlayMore(s *C.char) {
package1.Play((*package1.ExportedType)(s))
}
func main() {
PlayMore(C.CString("Hi"))
}
输出:
Hi