Go (简体中文) - ArchWiki

Jump to content

# Go (简体中文)

From ArchWiki

相关文章

- Go_package_guidelines_(简体中文)

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

This article or section needs expansion.

Reason: Mention delve. Perhaps in a Tools section. Also should explain tinygo. (Discuss in Talk:Go (简体中文))

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

## 安装

This article or section needs language, wiki syntax or style improvements. See Help:Style for reference.

Reason: Recommends go over gcc-go without stating why. (Discuss in Talk:Go (简体中文)#gccgo vs gc)

标准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`。

## 参考

- Golang官网
- Wikipedia article
- Examples with small descriptions
- Interactive Go training tour
- Go cross compilation
- IDEs and Plugins for Go

Category:

- Programming languages (简体中文)

Hidden categories:

- Pages or sections flagged with Template:Expansion
- Pages or sections flagged with Template:Style