导出以C类型作为参数的函数[不能使用x(类型* C.ctype)作为类型* package.C.ctype在package.Func]

时间:2016-08-18 08:21:41

标签: go cgo

图书馆代码(简化版):

// 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:

  • 低级API只使用Go语法包装C签名。参数和返回类型为C.xxx个类型。
  • 高级API为旧库提供纯Go接口,这意味着没有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

Go: Exporting functions with anonymous struct as a parameter [cannot use value (type struct {...}) as type struct {...} in argument to package.Func]

1 个答案:

答案 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