Go Package
本节将展示C示例程序用到的Go package
代码。Go package
的名字必须是main
,但是文件名可以随意,我们的例子中,文件名是usedByC.go
,分三部分展示。
你可能不了解Go package
机制,在第六章会详细的介绍。
第一部分的Go package
代码:
package main
import "C"
import (
"fmt"
)
前面提到,Go package
的名字必须是main
,同样的也需要导入"C" package
。
第二部分的代码如下:
//export PrintMessage
func PrintMessage() {
fmt.Println("A Go function!")
}
如果一个Go函数想要被C语言调用,必须要先导出。你应该在函数实现的开始部分,添加一行以export
开头的注释,export
后面要加上函数的名字,这样C程序才知道怎么使用。
最后一部分的代码:
//export Multiply
func Multiply(a, b int) int {
return a * b
}
func main() {
}
这个main()
函数不需要任何的函数体,因为不需要导出给C代码使用,同样的,要导出Multiply
函数,也需要将//export Multiply
注释添加到函数实现之前。
接着,你需要用Go代码生成一个C共享库,命令如下:
$ go build -o usedByC.o -buildmode=c-shared usedByC.go
上面的命令会产生usedByC.h
和usedByC.o
两个文件。
$ ls -l usedByC.*
-rw-r--r--@ 1 mtsouk staff
204
-rw-r--r-- 1 mtsouk staff
1365
-rw-r--r-- 1 mtsouk staff 2329472
$ file usedByC.o
usedByC.o: Mach-O 64-bit dynamically
Oct 31 20:37 usedByC.go
Oct 31 20:40 usedByC.h
Oct 31 20:40 usedByC.o
linked shared library x86_64
注意:不要修改usedByC.h
文件。