Go

提供: ArchWiki
2024年4月26日 (金) 00:53時点におけるKgx (トーク | 投稿記録)による版 (→‎ツール: 同期)
ナビゲーションに移動 検索に移動

Go は、Google がサポートするオープンソースプログラミング言語です。the Go documentation から:

Go は表現力豊かで、簡潔で、クリーンで効率的です。その同時実行メカニズムにより、マルチコアおよびネットワーク化されたマシンを最大限に活用するプログラムの作成が容易になり、また、その新しいタイプのシステムにより、柔軟なモジュール型プログラム構築が可能になります。Go はマシンコードに迅速にコンパイルされますが、ガベージコレクションの利便性と実行時リフレクションの機能を備えています。これは、動的に型付けされ解釈される言語のように感じられる、高速な静的型付けコンパイル言語です。

インストール

go パッケージを インストール して下さい、これには標準の Go コンパイラーとその他の開発ツールが含まれています。含まれるサブコマンドのリストについては、go コマンドのドキュメント を参照してください。

代替コンパイラ

go パッケージには、gc と呼ばれる標準 Go コンパイラが含まれています。次の代替コンパイラも使用できます。

gccgo

GCC のフロントエンド gccgo は、gcc-go パッケージによって提供されます。gccgo は、場合によっては gc より高速なバイナリを生成し、追加のオペレーティングシステムやアーキテクチャをターゲットにすることができます。実際には、ほぼすべてのワークロードにおいて、gcgccgo よりも高速なバイナリを生成します。

TinyGo

TinyGo は、組み込みシステムおよび WebAssembly 用の非常に小さなバイナリを生成するように設計された LLVM ベースのコンパイラです。これは、tinygo パッケージによって提供されます。

ツール

次のパッケージは Go 用の開発者ツールを提供します:

  • Go ツール — 主に 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
  • 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プログラミング言語用の最先端のリンター。
https://staticcheck.io/ || staticcheck
  • Yaegi — Goインタプリタ。yaegiコマンドラインインタープリタ /REPL を含みます。
https://github.com/traefik/yaegi || yaegi

インストールディレクトリ

go install コマンドは、GOBIN 環境変数 で指定されたディレクトリに Go 実行可能ファイルをインストールします。GOBIN のデフォルトは $GOPATH/bin、または GOPATH 環境変数が設定されていない場合は ~/go/bin です。

ヒント: go env を実行すると、すべての Go 変数を確認できます。

便宜上、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 .

GOOSGOARCH の有効な組み合わせについては、公式ドキュメント を参照してください。

CGO あり

ビルドに cgo が必要な場合は、CC/CXX 環境変数を介して 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!

代替 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 を見つけることができるはずです。

参照