当我尝试将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
,看起来应该是允许的。
答案 0 :(得分:3)
很遗憾,您无法在包之间传递C类型。您需要在导入C类型的包中执行任何必要的类型转换。根据{{3}}:
Cgo将C类型转换为等效的未导出的Go类型。因为 翻译是未导出的,Go包不应该暴露C. 导出的API中的类型:一个Go包中使用的C类型 不同于另一种使用的相同C类型。
如果您使用了常用的C转换方法,请考虑将go generate
与帮助程序脚本一起使用,以便在主源文件中需要的每个包中创建这些方法。不像解决方案那样具有公共库,但比手动更新多个包中的文件要好得多。