Golang中的Cgo是Go语言提供的一种机制,用于在Go程序和C/C++程序之间进行互操作,为Go程序员提供了一个直接调用C库以及使用C语言编写的代码的方法。
CGO 是什么
CGO 就是 C 和 Go,两个编程语言。指的是能够创建调用 C 代码的 Go 包。对照着 Go 代码中的 “C”
1
2
3
4
5
|
package main
import "C"
func main() {}
|
一旦程序中出现 import “C”,则意味着开启 CGO 特性。在进行 go build 等阶段时,将会调用 C 编译器(通常是 gcc 或 clang)。
CGO 对应的环境变量是 CGO_ENABLED,设置为 1 则开启 CGO,为 0 则关闭 CGO。
编译命令如下:
1
|
CGO_ENABLED=0 go build -o main main.go
|
CGO 快速上手
示例demo
hello.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package main
//void SayHello(const char* s);
import "C"
import "fmt"
func main() {
C.SayHello(C.CString("Hello, World"))
SayBye(C.CString("see you"))
}
// export SayBye
func SayBye(s *C.char) {
fmt.Println(C.GoString(s))
}
|
hello.c
1
2
3
4
5
6
7
|
#include <stdio.h>
#include "hello.h"
void SayHello(const char* s) {
puts(s);
puts(s);
}
|
hello.h
1
2
3
|
void SayHello(const char* s);
void SayBye(char* s);
|
编辑运行
1
|
go build -o main hello.go
|
原生c调用go
hello.go
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package main
import "C"
// export hello
func hello(value string) *C.char {
return C.CString("go hello" + value)
}
func main() {
// 必须有main函数,才能编译成C的库
}
|
生成c-shared文件
1
|
go build -buildmode=c-shared -o hello.so hello.go
|
生成.h文件,并链接上对应的.so程序库,即可在c程序中调用go程序
参考