Go (简体中文)
Go 是一种静态类型语言, 其语法是从 C语法演变而来, 增加了自动垃圾回收, 类型安全, 一些动态类型功能, 更多内置类型(例如可变长度的数组和键值映射), 以及大型标准库。
安装
标准Go编译器是 go
, 可以从 go 软件包中安装. 该 go
命令还包括各种工具,例如go get
, go doc
,等.
另一种编译器是 gcc-go, which is a Go frontend for the GNU Compiler Collection (GCC). 在某些情况下 gccgo
可能会进行更好优化. 如果有问题: 建议使用 go
.
大多数Go开发人员想要安装另一个软件包 go-tools. 这为Go用户提供了让工作变得更加容易使用各种常用工具, 如 goimports
, guru
, gorename
,等.
测试安装
通过构建一个简单程序来检查Go安装是否正确,具体操作如下: 首先创建一个名为 hello.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
环境变量 Environment variables (简体中文) 中以运行已安装软件:
export PATH="$PATH:$HOME/go/bin"
运行 go help gopath
以获取更多信息.
$GOPATH
工作方式类似于 $PATH
并且可以包含多个条目, 这对于拆分使用 go get
和您自己的源码、下载的软件包很有用; 例如 GOPATH=$HOME/go:$HOME/mygo
交叉编译到其他平台
go
可以很自然交叉编译到 很多平台.
如果构建不需要cgo cgo , 则只需将目标操作系统和体系结构指定为env vars即可 go build
:
$ GOOS=linux GOARCH=arm64 go build .
请参见 官方文档进行有效组合$GOOS
和 $GOARCH
。
另一方面,如果构建需要使用 cgo , 则必须 C/C++
通过 $CC/$CXX
env vars 提供交叉编译器路径.
假设您要针对 $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
您可以检查生成de二进制文件的体系结构实际上是 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现在应该可以在找到Go SDK /usr/lib/go
。