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程序

参考