# 如何实现 GO 调用 C 代码?
/*
int sum(int a, int b) {
return a+b;
}
*/
import "C"
func main() {
println(C.sum(1,1))
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
原理
- 在内存中开辟一个结构体
- 结构体中包含参数和返回值
- 结构体地址传入C方法
- C方法将结果写入返回值的位置
调度器的配合
- 协程需要抢占式调度
- 进入C程序之后,调度器无法抢占协程
- 调度器停止对此协程的调度
协程栈的切换
- C的栈不受Runtime管理
- 进入C时,需要将当前栈切换到线程的系统栈上
cgo 的优缺点
- cgo 可以让 go 调用现成的C实现
- cgo 限制了 go 语言的跨平台特性
- cgo 并不能提高Go语言的性能(切换栈等其他操作)
总结
- cgo 是让 go 语言调用c方法的技术
- cgo 需要 go 调度器和协程栈的配合
- cgo一般用于找不到go实现的情况
- cgo 不能提高性能,是一个临时解决方案