Go

出自 Arch Linux 中文维基

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 .

有關 GOOSGOARCH 的有效組合,請參閱官方文檔(英文)

使用 cgo[編輯 | 編輯原始碼]

如果構建需要 cgo,則必須通過 CCCXX 環境變量提供 C/C++ 交叉編譯器的路徑。

假設要為 GOOS=linuxGOARCH=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。

參見[編輯 | 編輯原始碼]