# Go (简体中文)

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

相关文章

- 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