Go to C

导出函数

使用 export 注释:

  1. package main
  2. import "C"
  3. import "fmt"
  4. //export Hello
  5. func Hello() {
  6. fmt.Println("Hello")
  7. }

⚠注意⚠:
//export Hello
//export 是一个整体,用于标记导出到 C 语言的 Go 函数,不能用空格分隔开

C to Go

引入接口

在启用cgo的语句上方注释中编辑C代码:

package main

//#include <stdio.h>
import "C"

func main() {
    C.puts(C.CString("Hello"))   
}

调用引入的函数需要使用 C.xxx ,作为C包的方法引入。

CGO 套娃

根据上述规则,我们可以将 Go 函数导出到 C 然后再使用 CGO 调用这个函数,打印一个字符串的例程如下:

package main

/*
#include "hello.h"
*/
import "C"
import "fmt"

//export PrintHelloGo
func PrintHelloGo() {
    fmt.Println(C.GoString(C.CString("Hello Go")))
}

其中比较关键的:

  • C.CString 将 Go string 类型转化成 CGO *C.char 类型
  • C.GoString 将 CGO *C.char 类型转化成 Go string 类型