Go - Arch Linux 中文维基

跳至內容

# Go

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Go，最近一次同步於 2023-08-06，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- Go 語言軟體打包準則

Go 是一門受 Google 支持的開源程式語言。根據 Go 文檔：

  Go 表達力強、簡潔、乾淨、高效。它的並發機制使編寫能夠最大限度地利用多核和聯網計算機的程序變得簡單，而它新穎的類型系統則使得靈活和模塊化程序構造變得可能。Go 可以快速編譯成機器代碼，同時還具有垃圾回收的便利性和運行時反射的強大功能。它是快速、靜態類型的編譯語言，同時感覺就像是動態類型的解釋型語言。

## 安裝

安裝 go包 軟體包，這包含標準 Go 編譯器和其他開發工具。可在 go 命令文檔（英文）中查看包含的子命令。

### 其他編譯器

go包 軟體包包含標準 Go 編譯器（名為 gc）。還可使用下面這些編譯器替代。

#### gccgo

gcc-go包 軟體包提供了 GCC 的一個前端 gccgo。在某些情況下，gccgo 生成的二進制文件可能比 gc 更快，而且可以為更多作業系統和架構生成二進制文件。實踐中，對於幾乎所有的負載，gc 生成的二進制文件都比 gccgo 更快。

#### TinyGo

TinyGo 是一個基於 LLVM 的編譯器，旨在為嵌入式系統和 WebAssembly 生成非常小的二進制文件。其由 tinygo包 軟體包提供。

### 工具

這些軟體包提供 Go 開發者工具：

- Go tools — 主要用於 Go 程序靜態分析的各種工具和 Go 軟體包。

  https://cs.opensource.google/go/x/tools || go-tools包

- gopls — 官方 Go 語言伺服器。

  https://pkg.go.dev/golang.org/x/tools/gopls || gopls包

- Delve — Go 程式語言的調試器。

  https://github.com/go-delve/delve || delve包

- go-bindata — 一款可從任意文件生成 Go 代碼的小工具。可用於在 Go 程序中嵌入二進制數據。

  https://github.com/shuLhan/go-bindata || go-bindataAUR, go-bindata-hashicorp包

- GoReleaser — Go 項目的發布自動化工具。

  https://goreleaser.com/ || goreleaser包

- gox — Go 交叉編譯工具，可並行為多個平台編譯。

  https://github.com/mitchellh/gox || gox包

- ko — Go 應用程式容器鏡像生成器。

  https://github.com/ko-build/ko || ko包

- revive — 一個快速、可配置、可擴展、靈活、美觀的 Go linter。

  https://revive.run/ || revive包

- Staticcheck — 先進的 Go 程式語言 linter。

  https://staticcheck.io/ || staticcheck包

- Yaegi — Go 解釋器。包括 yaegi 命令行解釋器/REPL。

  https://github.com/traefik/yaegi || yaegi包

### 安裝目錄

`go install` 命令會將 Go 可執行文件安裝到 `GOBIN` 環境變量定義的目錄或 `GOPATH` 環境變量第一個條目的 `bin` 子目錄。默認情況下是 `~/go/bin`。

提示：運行 `go env` 來查看所有 Go 變量。

為方便起見，可將 bin 子目錄添加到 `PATH` 中：

    $ export PATH="$PATH:$(go env GOBIN):$(go env GOPATH)/bin"

更多信息，請參見如何編寫 Go 代碼（英文）和 `go help gopath`。

## 提示和技巧

### 編譯原始碼

可以編寫一個 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!

## 故障排除

### JetBrains Go 插件

如果使用 JetBrains IDE，而 Go 插件找不到 Go SDK 路徑，則可能是使用了不兼容的軟體包。移除 gcc-go 軟體包並替換為 go。如果已設置 `GOPATH`，那 IDE 現在應該可以找到位於 `/usr/lib/go` 的 Go SDK。

## 參見

- 官方網站（英文）
- 維基百科文章（英文）
- 程序樣例（包含簡短的描述）（英文）
- 交互式 Go 訓練教程（英文）
- Go 交叉編譯（英文）
- Go IDE 和插件（英文）

分類：​

- 程式語言

Go
新增話題