三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Go-CGO编程实战从Go调用C到性能敏感场景的混合编程

Go-CGO编程实战从Go调用C到性能敏感场景的混合编程

Go-CGO编程实战从Go调用C到性能敏感场景的混合编程

文章导语

CGO是Go与C/C++互操作的桥梁。在音视频处理、机器学习推理、系统编程等场景中,CGO不可或缺。但CGO也有显著的性能开销和使用陷阱。

一、基础CGO调用

/* #include <stdlib.h> */import"C"import"unsafe"funcRandom()int{returnint(C.random())}funcMalloc(sizeint)unsafe.Pointer{returnC.malloc(C.size_t(size))}

二、CGO性能开销

CGO调用开销约40-100ns/次(纯Go函数调用约1ns)。批量操作可摊薄开销。

三、实战

// Go调用现有的C加密库/* #cgo LDFLAGS: -lcrypto #include <openssl/sha.h> */funcSHA256(data[]byte)[32]byte{varresult[32]byteC.SHA256((*C.uchar)(&data[0]),C.size_t(len(data)),(*C.uchar)(&result[0]))returnresult}

四、全文总结

CGO适合已有C库的复用,但有性能开销。import "C"前必须有注释块,C.malloc需手动C.free。

参考文献

  1. Go CGO文档: https://pkg.go.dev/cmd/cgo
  2. Go Blog - C? Go? Cgo!
  3. Dave Cheney - cgo is not Go
← 返回列表