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.husedByC.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文件。

最后编辑: kuteng  文档更新时间: 2021-03-27 20:14   作者:kuteng