Go
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。