Go (简体中文) - ArchWiki

Jump to content

相关文章

- Go package guidelines (简体中文)

翻译状态：本文是 Go 的翻译。上次翻译日期：2022-07-18。如果英文版本有所更改，则您可以帮助同步翻译。

Go 是一种静态类型语言，其语法是从 C 语法演变而来，增加了自动垃圾回收、类型安全、一些动态类型功能、更多内置类型（例如可变长度的数组和键值映射）以及大型标准库。

## 安装

标准 Go 编译器是 `go`，可以通过 go 软件包中安装。`go` 命令还包括各种工具，例如 `go get`、`go doc` 等。 另一个编译器是 gcc-go，这是 GNU Compiler Collection（GCC）的 Go 前端。在某些情况下 `gccgo` 可能优化更好。如有疑问：使用 `go`。

大多数 Go 开发人员想要安装另一个软件包 go-tools。这提供了能使 Go 更易用的各种常用工具，如 `goimports`、`guru`、`gorename` 等。

### 测试安装

可以通过构建一个简单程序来检查 Go 是否已正确安装，具体操作如下：

    hello.go

    package main

    import "fmt"

    func main() {
        fmt.Println("Hello, Arch!")
    }

接着通过 go 工具运行它：

    $ go run hello.go

    Hello, Arch!

使用标准 gc 编译器编译（等价于 `go build -compiler=gc hello.go`）：

    $ go build hello.go

使用 gccgo 编译 (等价于 `go build -compiler=gccgo hello.go`）：

    $ gccgo hello.go -o hello

### $GOPATH

Go 期望源代码存放在 `$GOPATH` 中（默认为 `~/go`）。

提示： 可以通过命令 `go env` 查看所有 Go 变量

创建一个工作空间目录：

    $ mkdir -p ~/go/src

文件目录 `~/go/src` 用于存放包的源码。在编译时会为可执行文件创建 `bin`，并创建 `pkg` 用于缓存各个包。可能还需要添加 `~/go/bin` 到 `$PATH` 环境变量中来运行已安装的 Go：

    export PATH="$PATH:$HOME/go/bin"

运行 `go help gopath` 以获取更多信息。

提示： `$GOPATH` 类似于 `$PATH` 并且可以包含多个条目，这对于拆分使用 `go get` 下载的软件包和你自己的源码很有用；例如 `GOPATH=$HOME/go:$HOME/mygo`

### 交叉编译到其他平台

`go` 可以很容易地交叉编译到 很多平台。

如果构建不需要 cgo，则只需将目标操作系统和架构指定为 `go build` 的环境变量：

    $ GOOS=linux GOARCH=arm64 go build .

有关 `$GOOS` 和 `$GOARCH` 的有效组合，请参阅官方文档。

另一方面，如果构建需要使用 cgo，则必须通过 `$CC/$CXX` 环境变量提供 `C/C++` 交叉编译器的路径。

假设要为 `$GOOS=linux` 和 `$GOARCH=arm64` 交叉编译。

首先要安装 aarch64-linux-gnu-gcc 交叉编译器。

这是一个需要 `cgo` 的简单示例程序，以便测试交叉编译过程：

    $ cat > hello.go <<EOF
    package main

    // #include <stdio.h>
    // void hello() {  puts("Hello, Arch!"); }
    import "C"

    func main() { C.hello() }
    EOF

然后，可以这样交叉编译：

    $ GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=/usr/bin/aarch64-linux-gnu-gcc go build hello.go

您可以检查生成的二进制文件的架构实际上是 `aarch64`：

    $ file hello
    hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=b1d92ae8840a019f36cc2aee4606b6ae4a581bf1, for GNU/Linux 3.7.0, not stripped

如果将 `hello` 复制到合适的主机，则可以运行：

    [alarm@rpi3 ~]$ uname -a
    Linux alarm 5.3.8-1-ARCH #1 SMP Tue Oct 29 19:31:23 MDT 2019 aarch64 GNU/Linux
    [alarm@arpi3 ~]$ ./hello
    Hello, Arch!

## 故障排除

### Jetbrains Go 插件

如果使用 Jetbrains IDE，而 Go 插件找不到 Go SDK 路径，则可能是使用了不兼容的软件包。移除 `gcc-go` 包并替换为 `go`。如果已设置 `$GOPATH`，那 IDE 现在应该可以找到位于 `/usr/lib/go` 的 Go SDK。

## 参见

- Golang官网
- Wikipedia 文章
- Examples with small descriptions
- Interactive Go training tour
- Go 交叉编译
- IDEs and Plugins for Go

Category:

- Programming languages (简体中文)