> For the complete documentation index, see [llms.txt](https://hantmac.gitbook.io/mastering-go-second/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hantmac.gitbook.io/mastering-go-second/02.0/02.4/02.4.1.md).

# Go 包

本小节将向你提供将在 C 程序中使用的 Go package 的代码。 Go package 的名称必须是`main`，但其文件名可以是你想要的任何名称；在这我们将文件命名为为`useByC.go`，并分为三部分。

> Tip: 你将在*第 6 章-你可能不了解 Go package 和 Go 函数*中了解有关 Go package 的更多信息。

第一部分代码：

```go
package main
import "C"
import (
  "fmt"
)
```

正如我之前所说，必须将 Go 包命名为`main`。你还需要在 Go 代码中导入 C 包。

第二部分代码：

```go
//export PrintMessage
func PrintMessage() {
  fmt.Println("A Go function!")
}
```

必须将 C 代码准备调用的 Go 函数导出。这意味着你应在导出之前放置一个以`// export`开头的注释行。在`// export`的后面你将需要输入函数的名称，因为这是 C 代码将使用的名称。

最后一部分代码：

```go
//export Multiply
func Multiply(a, b int) int {
  return a * b
}

func main() {
}
```

`usedByC.go`的`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 Jan 10 09:17 usedByC.go
-rw-r--r--  1 mtsouk  staff     1365 Jan 22 22:14 usedByC.h
-rw-r--r--  1 mtsouk  staff  2329472 Jan 22 22:14 usedByC.o
$ file usedByC.o
usedByC.o: Mach-O 64-bit dynamically linked shared library x86_64
```

你不应对 usedByC.h 进行任何更改。
