Go-CGO编程实战从Go调用C到性能敏感场景的混合编程
文章导语
CGO是Go与C/C++互操作的桥梁。在音视频处理、机器学习推理、系统编程等场景中,CGO不可或缺。但CGO也有显著的性能开销和使用陷阱。
一、基础CGO调用
go
/*
#include <stdlib.h>
*/
import "C"
import "unsafe"
func Random() int {
return int(C.random())
}
func Malloc(size int) unsafe.Pointer {
return C.malloc(C.size_t(size))
}
二、CGO性能开销
CGO调用开销约40-100ns/次(纯Go函数调用约1ns)。批量操作可摊薄开销。
三、实战
go
// Go调用现有的C加密库
/*
#cgo LDFLAGS: -lcrypto
#include <openssl/sha.h>
*/
func SHA256(data []byte) [32]byte {
var result [32]byte
C.SHA256((*C.uchar)(&data[0]), C.size_t(len(data)), (*C.uchar)(&result[0]))
return result
}
四、全文总结
CGO适合已有C库的复用,但有性能开销。import "C"前必须有注释块,C.malloc需手动C.free。
参考文献
- Go CGO文档: https://pkg.go.dev/cmd/cgo
- Go Blog - C? Go? Cgo!
- Dave Cheney - cgo is not Go