# 如何实现 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

原理

  • 在内存中开辟一个结构体
  • 结构体中包含参数和返回值
  • 结构体地址传入C方法
  • C方法将结果写入返回值的位置

调度器的配合

  • 协程需要抢占式调度
  • 进入C程序之后,调度器无法抢占协程
  • 调度器停止对此协程的调度

协程栈的切换

  • C的栈不受Runtime管理
  • 进入C时,需要将当前栈切换到线程的系统栈上

cgo 的优缺点

  • cgo 可以让 go 调用现成的C实现
  • cgo 限制了 go 语言的跨平台特性
  • cgo 并不能提高Go语言的性能(切换栈等其他操作)

总结

  • cgo 是让 go 语言调用c方法的技术
  • cgo 需要 go 调度器和协程栈的配合
  • cgo一般用于找不到go实现的情况
  • cgo 不能提高性能,是一个临时解决方案
上次更新: 3/12/2023,