Go
Go 是由 Google 支持的开源编程语言。来自 Go 文档
- Go 语言富有表现力、简洁、清晰和高效。它的并发机制使编写能够充分利用多核和联网机器的程序变得容易,而其新颖的类型系统实现了灵活和模块化的程序构建。Go 编译为机器码的速度很快,但仍然具有垃圾回收的便利性和运行时反射的强大功能。它是一种快速、静态类型、编译型语言,但感觉像是动态类型、解释型语言。
安装
安装 go 软件包,其中包含标准的 Go 编译器和其他开发工具。有关包含的子命令列表,请参阅 go 命令文档。
替代编译器
go 软件包包含标准的 Go 编译器,称为 gc。以下替代编译器也可用。
gccgo
用于 GCC 的前端 gccgo 由 gcc-go 软件包提供。在某些情况下,gccgo 可能会比 gc 产生更快的二进制文件,并且可以针对其他操作系统和架构。在实践中,对于几乎所有工作负载,gc 产生的二进制文件都比 gccgo 更快。
TinyGo
TinyGo 是一款基于 LLVM 的编译器,旨在为嵌入式系统和 WebAssembly 生成非常小的二进制文件。它由 tinygo 软件包提供。
工具
以下软件包为 Go 提供开发工具
- Go tools — 用于 Go 程序静态分析的各种工具和 Go 包。
- gopls — 官方 Go 语言服务器。
- Delve — Go 编程语言的调试器。
- GoReleaser — Go 项目的发布自动化工具。
- gox — 用于 Go 交叉编译的工具,可以并行化多个平台的构建。
- ko — 用于 Go 应用程序的容器镜像构建器。
- revive — 一款快速、可配置、可扩展、灵活且美观的 Go 代码检查器。
- Staticcheck — 一款先进的 Go 编程语言代码检查器。
- Yaegi — Go 解释器。包含 yaegi 命令行解释器/REPL。
您还可以使用 go get -tool
和 go 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 Code 和 go 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 .
有关 GOOS
和 GOARCH
的有效组合,请参阅 官方文档。
使用 cgo
如果您的构建需要 cgo,则必须通过 CC
/CXX
环境变量提供 C/C++ 交叉编译器的路径。
假设您要为 GOOS=linux
和 GOARCH=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。