如何在go包之间传递C对象?

时间:2017-07-24 13:50:19

标签: go

当我尝试将C.int从包main传递给名为common的帮助程序包中的函数时,我收到以下错误:

main.go:24: cannot use argc (type C.int) as type common.C.int in argument to common.GoStrings

来自common.go

/* 
    ...
*/
import "C"

...

func GoStrings(argc C.int, argv **C.char) (args []string) {
    // do stuff
}

来自main.go

/*
#cgo LDFLAGS: -lpam -fPIC
#define PAM_SM_AUTH

#include <security/pam_appl.h>
*/
import "C"

...

func pam_sm_authenticate(pamh *C.pam_handle_t, flags, argc C.int, argv **C.char) C.int {
    args := common.GoStrings(argc, argv)
    ...
}

有没有办法来回传递这些物体?我已尝试过类型转换为例如common.C.int,但这似乎不是有效的语法。我希望能够从多个不同的主程序中调用GoStrings,看起来应该是允许的。

1 个答案:

答案 0 :(得分:3)

很遗憾,您无法在包之间传递C类型。您需要在导入C类型的包中执行任何必要的类型转换。根据{{​​3}}:

  

Cgo将C类型转换为等效的未导出的Go类型。因为   翻译是未导出的,Go包不应该暴露C.   导出的API中的类型:一个Go包中使用的C类型   不同于另一种使用的相同C类型。

如果您使用了常用的C转换方法,请考虑将go generate与帮助程序脚本一起使用,以便在主源文件中需要的每个包中创建这些方法。不像解决方案那样具有公共库,但比手动更新多个包中的文件要好得多。