Go Package

本节将展示C示例程序用到的Go package代码。Go package的名字必须是main,但是文件名可以随意,我们的例子中,文件名是usedByC.go,分三部分展示。

你可能不了解Go package机制,在第六章会详细的介绍。

第一部分的Go package代码:

  1. package main
  2. import "C"
  3. import (
  4. "fmt"
  5. )

前面提到,Go package的名字必须是main,同样的也需要导入"C" package

第二部分的代码如下:

  1. //export PrintMessage
  2. func PrintMessage() {
  3. fmt.Println("A Go function!")
  4. }

如果一个Go函数想要被C语言调用,必须要先导出。你应该在函数实现的开始部分,添加一行以export开头的注释,export后面要加上函数的名字,这样C程序才知道怎么使用。

最后一部分的代码:

  1. //export Multiply
  2. func Multiply(a, b int) int {
  3. return a * b
  4. }
  5. func main() {
  6. }

这个main()函数不需要任何的函数体,因为不需要导出给C代码使用,同样的,要导出Multiply函数,也需要将//export Multiply注释添加到函数实现之前。

接着,你需要用Go代码生成一个C共享库,命令如下:

  1. $ go build -o usedByC.o -buildmode=c-shared usedByC.go

上面的命令会产生usedByC.husedByC.o两个文件。

  1. $ ls -l usedByC.*
  2. -rw-r--r--@ 1 mtsouk staff
  3. 204
  4. -rw-r--r-- 1 mtsouk staff
  5. 1365
  6. -rw-r--r-- 1 mtsouk staff 2329472
  7. $ file usedByC.o
  8. usedByC.o: Mach-O 64-bit dynamically
  9. Oct 31 20:37 usedByC.go
  10. Oct 31 20:40 usedByC.h
  11. Oct 31 20:40 usedByC.o
  12. linked shared library x86_64

注意:不要修改usedByC.h文件。