

新闻资讯
技术学院go 的 `go test` 不支持直接在 `_test.go` 文件中使用 `import "c"`,但可通过分离 cgo 逻辑与测试代码实现可靠测试——将 c 交互封装在普通 `.go` 文件中,并通过纯 go 接口暴露功能。
在 Go 项目中集成 C 代码(如复用现有 C 库、性能敏感模块或系统级操作)时,常需借助 CGO。然而,go test 工具明确禁止在以 _test.go 结尾的文件中使用 import "C"——这是为避免测试构建环境与主构建环境不一致引发的链接、符号或 ABI 兼容性问题。
✅ 正确做法是职责分离:
示例结构:
// c_wrapper.go package mypkg /* #include#include */ import "C" import "unsafe" // ExportedGoFunc 是供测试和业务调用的纯 Go 接口 func ExportedGoFunc(input string) int { cStr := C.CString(input) defer C.free(unsafe.Pointer(cStr)) return int(C.strlen(cStr)) }
// mypkg_test.go package mypkg import "testing" func TestExportedGoFunc(t *testing.T) { got := ExportedGoFunc("hello") want := 5 if got != want { t.Errorf("Expected %d, got %d", want, got) } }
⚠️ 注意事项:
通过这种模式,你既能享受 C 的底层能力,又能保持 Go 测试的纯净性、可重复性和跨平台兼容性。