Go
Go は、Google がサポートするオープンソースプログラミング言語です。the Go documentation から:
Go は表現力豊かで、簡潔で、クリーンで効率的です。その同時実行メカニズムにより、マルチコアおよびネットワーク化されたマシンを最大限に活用するプログラムの作成が容易になり、また、その新しいタイプのシステムにより、柔軟なモジュール型プログラム構築が可能になります。Go はマシンコードに迅速にコンパイルされますが、ガベージコレクションの利便性と実行時リフレクションの機能を備えています。これは、動的に型付けされ解釈される言語のように感じられる、高速な静的型付けコンパイル言語です。
目次
インストール
go パッケージを インストール して下さい、これには標準の Go コンパイラーとその他の開発ツールが含まれています。含まれるサブコマンドのリストについては、go コマンドのドキュメント を参照してください。
代替コンパイラ
go パッケージには、gc と呼ばれる標準 Go コンパイラが含まれています。次の代替コンパイラも使用できます。
gccgo
GCC のフロントエンド gccgo は、gcc-go パッケージによって提供されます。gccgo は、場合によっては gc より高速なバイナリを生成し、追加のオペレーティングシステムやアーキテクチャをターゲットにすることができます。実際には、ほぼすべてのワークロードにおいて、gc は gccgo よりも高速なバイナリを生成します。
TinyGo
TinyGo は、組み込みシステムおよび WebAssembly 用の非常に小さなバイナリを生成するように設計された LLVM ベースのコンパイラです。これは、tinygo パッケージによって提供されます。
ツール
次のパッケージは Go 用の開発者ツールを提供します:
- Go ツール — 主に Go プログラムの静的解析のための様々なツールと Go パッケージ。
- gopls — 公式 Go 言語サーバ
- Delve — Go プログラミング言語のデバッガ。
- go-bindata — 任意のファイルから Go コードを生成する小さなユーティリティ。Go プログラムにバイナリデータを埋め込むのに便利です。
- GoReleaser — Go プロジェクト用のリリース自動化ツール
- gox — 複数のプラットフォームのビルドを並列化する Go クロスコンパイル用のツール。
- ko — Go アプリケーション用のコンテナイメージビルダ。
- revive — 高速、構成可能、拡張可能、柔軟で美しい Go 用 linter。
- Staticcheck — Goプログラミング言語用の最先端のリンター。
- Yaegi — Goインタプリタ。yaegiコマンドラインインタープリタ /REPL を含みます。
インストールディレクトリ
go install
コマンドは、GOBIN
環境変数 で指定されたディレクトリに Go 実行可能ファイルをインストールします。GOBIN
のデフォルトは $GOPATH/bin
、または GOPATH
環境変数が設定されていない場合は ~/go/bin
です。
便宜上、bin サブディレクトリを PATH
に追加します:
$ export PATH="$PATH:$(go env GOBIN):$(go env GOPATH)/bin"
詳細については、Go コードの書き方 および go help install
を参照してください。
ヒントとテクニック
ソースコードのコンパイル
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 が必要ない場合は、ターゲット OS とアーキテクチャを 環境変数 として 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!
代替 Go モジュールミラーの使用
デフォルトでは、Go は Google のサービス [1] をモジュールミラーとして使用します。
代替ミラーが必要な場合は、環境変数 GOPROXY
を使用して変更できます。次に例を示します:
$ export GOPROXY=https://goproxy.io/
多数のパブリックモジュールミラーが利用可能です。Go および Hugo Proxy Servers を参照してください。
トラブルシューティング
Jetbrains の Go プラグイン
JetBrains IDE を使用していて、Go プラグインが Go SDK パスを見つけられない場合は、互換性のないパッケージを使用している可能性があります。gcc-go パッケージを削除し、go に置き換えます。GOPATH
が設定されている場合、IDE は /usr/lib/go
で Go SDK を見つけることができるはずです。