Go

来自 ArchWiki

Go 是由 Google 支持的开源编程语言。来自 Go 文档

Go 语言富有表现力、简洁、清晰和高效。它的并发机制使编写能够充分利用多核和联网机器的程序变得容易,而其新颖的类型系统实现了灵活和模块化的程序构建。Go 编译为机器码的速度很快,但仍然具有垃圾回收的便利性和运行时反射的强大功能。它是一种快速、静态类型、编译型语言,但感觉像是动态类型、解释型语言。

安装

安装 go 软件包,其中包含标准的 Go 编译器和其他开发工具。有关包含的子命令列表,请参阅 go 命令文档

替代编译器

go 软件包包含标准的 Go 编译器,称为 gc。以下替代编译器也可用。

gccgo

用于 GCC 的前端 gccgogcc-go 软件包提供。在某些情况下,gccgo 可能会比 gc 产生更快的二进制文件,并且可以针对其他操作系统和架构。在实践中,对于几乎所有工作负载,gc 产生的二进制文件都比 gccgo 更快。

TinyGo

TinyGo 是一款基于 LLVM 的编译器,旨在为嵌入式系统和 WebAssembly 生成非常小的二进制文件。它由 tinygo 软件包提供。

工具

以下软件包为 Go 提供开发工具

  • Go tools — 用于 Go 程序静态分析的各种工具和 Go 包。
https://cs.opensource.google/go/x/tools || go-tools
  • gopls — 官方 Go 语言服务器。
https://pkg.go.dev/golang.org/x/tools/gopls || gopls
  • Delve — Go 编程语言的调试器。
https://github.com/go-delve/delve || delve
  • GoReleaser — Go 项目的发布自动化工具。
https://goreleaser.com/ || goreleaser
  • gox — 用于 Go 交叉编译的工具,可以并行化多个平台的构建。
https://github.com/mitchellh/gox || gox
  • ko — 用于 Go 应用程序的容器镜像构建器。
https://github.com/ko-build/ko || ko
  • revive — 一款快速、可配置、可扩展、灵活且美观的 Go 代码检查器。
https://revive.run/ || revive
  • Staticcheck — 一款先进的 Go 编程语言代码检查器。
https://staticcheck.io/ || staticcheck
  • Yaegi — Go 解释器。包含 yaegi 命令行解释器/REPL。
https://github.com/traefik/yaegi || yaegi

您还可以使用 go get -toolgo tool 在模块中安装和运行开发工具。有关说明,请参阅 关于工具依赖项的官方文档

安装目录

go install 命令将 Go 可执行文件安装到由 GOBIN 环境变量命名的目录中。如果未设置 GOPATH 环境变量,则 GOBIN 默认为 $GOPATH/bin~/go/bin

提示: 您可以通过运行 go env 查看所有 Go 变量

为了方便起见,将 bin 子目录添加到 PATH

$ export PATH="$PATH:$(go env GOBIN):$(go env GOPATH)/bin"

有关更多信息,请参阅 How to Write Go Codego help install

技巧与诀窍

编译源代码

您可以编写一个 Hello World 程序,如下所示

hello.go
package main

import "fmt"

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

然后使用 go 工具运行它

$ go run hello.go
Hello, Arch!

使用标准编译器编译(与 go build -compiler=gc hello.go 相同)

$ go build hello.go

使用 gccgo 编译(与 go build -compiler=gccgo hello.go 相同)

$ gccgo hello.go -o hello

使用 tinygo 编译

$ tinygo build -o hello ./hello.go

交叉编译到其他平台

标准编译器可以原生交叉编译到 多个平台。该过程因源代码是否使用 cgo 调用 C 代码而异。

不使用 cgo

如果您的构建不需要 cgo,则只需将目标操作系统和架构指定为 环境变量 传递给 go build

$ GOOS=linux GOARCH=arm64 go build .

有关 GOOSGOARCH 的有效组合,请参阅 官方文档

使用 cgo

如果您的构建需要 cgo,则必须通过 CC/CXX 环境变量提供 C/C++ 交叉编译器的路径。

假设您要为 GOOS=linuxGOARCH=arm64 进行交叉编译。

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

这是一个需要 cgo 的示例程序,以便我们可以测试交叉编译过程

hello.go
package main

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

func main() {
    C.hello()
}

然后,您可以像这样交叉编译它

$ 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!

使用备用 Go 模块镜像

默认情况下,Go 使用 Google 的服务 proxy.golang.org 作为模块镜像。

如果需要备用镜像,可以使用 环境变量 GOPROXY 进行更改,例如

$ export GOPROXY=https://goproxy.io/

许多公共模块镜像可用,例如:Go 和 Hugo Proxy 服务器

故障排除

JetBrains Go 插件

如果您正在使用 JetBrains IDE 并且 Go 插件找不到您的 Go SDK 路径,则您可能正在使用不兼容的软件包。删除 gcc-go 软件包并将其替换为 go。如果您的 GOPATH 已设置,则 IDE 现在应该能够在 /usr/lib/go 找到您的 Go SDK。

参见