「Go」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(言語間リンク)
(関連記事を同期)
 
(同じ利用者による、間の7版が非表示)
3行目: 3行目:
 
[[es:Go]]
 
[[es:Go]]
 
[[ru:Go]]
 
[[ru:Go]]
  +
[[zh-hans:Go]]
[http://golang.org/ Go] は C 言語に由来する構文を持つ静的型付言語です。ガベージコレクションによるメモリ管理、型安全性、動的型付けの機能、可変長配列やキーバリューマップなどの型、膨大な標準ライブラリなどが追加されています。
 
  +
{{Related articles start}}
  +
{{Related|Go パッケージガイドライン}}
  +
{{Related articles end}}
  +
[https://go.dev/ Go] は、Google がサポートするオープンソースプログラミング言語です。[https://go.dev/doc/ the Go documentation] から:
  +
  +
Go は表現力豊かで、簡潔で、クリーンで効率的です。その同時実行メカニズムにより、マルチコアおよびネットワーク化されたマシンを最大限に活用するプログラムの作成が容易になり、また、その新しいタイプのシステムにより、柔軟なモジュール型プログラム構築が可能になります。Go はマシンコードに迅速にコンパイルされますが、ガベージコレクションの利便性と実行時リフレクションの機能を備えています。これは、動的に型付けされ解釈される言語のように感じられる、高速な静的型付けコンパイル言語です。
   
 
== インストール ==
 
== インストール ==
   
  +
{{pkg|go}} パッケージを [[インストール]] して下さい、これには標準の Go コンパイラーとその他の開発ツールが含まれています。含まれるサブコマンドのリストについては、[https://pkg.go.dev/cmd/go ''go'' コマンドのドキュメント] を参照してください。
今日 Go のコンパイラは2つ存在しており、どちらも[[公式リポジトリ]]から[[インストール]]できます:
 
   
  +
=== 代替コンパイラ ===
* '''go''': {{pkg|go}} で[[インストール]]できるコンパイルツールのインターフェイス
 
** コンパイルが高速
 
** 公式ツール (go get や go doc など)
 
** クロスコンパイル
 
   
* '''gccgo''': {{pkg|gcc-go}} で[[インストル]]できるコンパイラコレクションに含まれている ''gcc'' フロトエンド
+
{{pkg|go}} パッケジには、''gc'' と呼ばれ標準 Go コンパイラ含まれています。次代替コパイラも使用できます。
** goroutine がフルフローになる
 
** バイナリのサイズが小さい (動的リンク)
 
   
  +
==== gccgo ====
=== インストールのテスト ===
 
   
  +
[[GCC]] のフロントエンド [https://go.dev/doc/install/gccgo gccgo] は、{{pkg|gcc-go}} パッケージによって提供されます。''gccgo'' は、場合によっては ''gc'' より高速なバイナリを生成し、追加のオペレーティングシステムやアーキテクチャをターゲットにすることができます。[https://meltware.com/2019/01/16/gccgo-benchmarks-2019.html 実際には、ほぼすべてのワークロードにおいて、''gc'' は ''gccgo'' よりも高速なバイナリを生成します。]
Go が正しくインストールされたかは以下のような小さなプログラムをビルドして確認できます:
 
  +
  +
==== TinyGo ====
  +
  +
[https://tinygo.org/ TinyGo] は、組み込みシステムおよび WebAssembly 用の非常に小さなバイナリを生成するように設計された [[LLVM]] ベースのコンパイラです。これは、{{pkg|tinygo}} パッケージによって提供されます。
  +
  +
=== ツール ===
  +
  +
次のパッケージは Go 用の開発者ツールを提供します:
  +
  +
* {{App|Go ツール|主に Go プログラムの静的解析のための様々なツールと Go パッケージ。|https://cs.opensource.google/go/x/tools|{{Pkg|go-tools}}}}
  +
* {{App|gopls|公式 Go 言語サーバ|https://pkg.go.dev/golang.org/x/tools/gopls|{{Pkg|gopls}}}}
  +
* {{App|Delve|Go プログラミング言語のデバッガ。|https://github.com/go-delve/delve|{{Pkg|delve}}}}
  +
* {{App|GoReleaser|Go プロジェクト用のリリース自動化ツール |https://goreleaser.com/|{{Pkg|goreleaser}}}}
  +
* {{App|gox|複数のプラットフォームのビルドを並列化する Go クロスコンパイル用のツール。|https://github.com/mitchellh/gox|{{Pkg|gox}}}}
  +
* {{App|ko|Go アプリケーション用のコンテナイメージビルダ。|https://github.com/ko-build/ko|{{Pkg|ko}}}}
  +
* {{App|revive|高速、構成可能、拡張可能、柔軟で美しい Go 用 linter。|https://revive.run/|{{Pkg|revive}}}}
  +
* {{App|Staticcheck|Goプログラミング言語用の最先端のリンター。|https://staticcheck.io/|{{Pkg|staticcheck}}}}
  +
* {{App|Yaegi|Goインタプリタ。yaegi''コマンドラインインタープリタ /REPL を含みます。|https://github.com/traefik/yaegi|{{Pkg|yaegi}}}}
  +
  +
=== インストールディレクトリ ===
  +
  +
{{ic|go install}} コマンドは、{{ic|GOBIN}} [[環境変数]] で指定されたディレクトリに Go 実行可能ファイルをインストールします。{{ic|GOBIN}} のデフォルトは {{ic|$GOPATH/bin}}、または {{ic|GOPATH}} 環境変数が設定されていない場合は {{ic|~/go/bin}} です。
  +
  +
{{Tip|{{ic|go env}} を実行すると、すべての Go 変数を確認できます。}}
  +
  +
便宜上、bin サブディレクトリを {{ic|PATH}} に追加します:
  +
  +
$ export PATH="$PATH:$(go env GOBIN):$(go env GOPATH)/bin"
  +
  +
詳細については、[https://go.dev/doc/code Go コードの書き方] および {{ic|go help install}} を参照してください。
  +
  +
== ヒントとテクニック ==
  +
  +
=== ソースコードのコンパイル ===
  +
  +
Hello World プログラムは次のように作成できます:
   
 
{{hc|hello.go|
 
{{hc|hello.go|
32行目: 69行目:
 
}}
 
}}
   
go ツールを使て実行:
+
次に、''go'' ツールを使用して実行します:
  +
 
{{hc|$ go run hello.go|
 
{{hc|$ go run hello.go|
 
Hello, Arch!
 
Hello, Arch!
 
}}
 
}}
   
標準の ''gc'' コンパイラコンパイル ({{ic|1=go build -compiler=gc hello.go}} と同じ):
+
標準コンパイラによるコンパイル ({{ic|1=go build -compiler=gc hello.go}} と同じ):
   
 
$ go build hello.go
 
$ go build hello.go
   
''gccgo'' コンパイル ({{ic|1=go build -compiler=gccgo hello.go}} と同じ):
+
''gccgo'' によるコンパイル ({{ic|1=go build -compiler=gccgo hello.go}} と同じ):
   
 
$ gccgo hello.go -o hello
 
$ gccgo hello.go -o hello
   
  +
''tinygo'' でのコンパイル:
=== $GOPATH ===
 
   
  +
$ tinygo build -o hello ./hello.go
{{ic|import}} ステートメントなどで使用される、Go の依存パッケージは、{{ic|$GOPATH}} 変数、そして {{ic|$GOROOT}} (''go'' のインストールディレクトリ、デフォルトでは {{ic|/usr/lib/go}}) で検索されます。基本の {{ic|$GOROOT}} からだけでなく、外部の依存パッケージを使う場合は、{{ic|~/.bash_profile}} (もしくはそれに類する設定ファイル) にワークスペースを指定する必要があります:
 
   
  +
=== 他のプラットフォームへのクロスコンパイル ===
export GOPATH=~/go
 
   
  +
標準コンパイラは、[https://go.dev/doc/install/source#introduction 多くのプラットフォーム] に対してネイティブにクロスコンパイルできます。手順は、ソースコードが [https://pkg.go.dev/cmd/cgo cgo] を使用して C コードを呼び出すかどうかによって異なります。
{{Tip|{{ic|go env}} を実行することで Go の変数を確認できます。}}
 
   
  +
==== cgo なし ====
ワークスペースを作成:
 
   
  +
ビルドに cgo が必要ない場合は、ターゲット OS とアーキテクチャを [[環境変数]] として {{ic|go build}} に指定するだけです。
$ mkdir -p ~/go/{bin,src}
 
   
  +
$ GOOS=linux GOARCH=arm64 go build .
プロジェクトのソースの保存には {{ic|src}} ディレクトリが、実行可能ファイルには {{ic|bin}} が使われます。
 
   
  +
{{ic|GOOS}} と {{ic|GOARCH}} の有効な組み合わせについては、[https://go.dev/doc/install/source#environment 公式ドキュメント] を参照してください。
また、{{ic|bin}} ディレクトリのパスを {{ic|$PATH}} [[環境変数]]に追加することで (Go 言語で書かれた) インストールしたプログラムを ({{ic|ls}} などと同じように) どこでも実行できるようになります:
 
   
  +
==== cgo あり ====
export PATH="$PATH:$GOPATH/bin"
 
   
  +
ビルドに cgo が必要な場合は、{{ic|CC}}/{{ic|CXX}} 環境変数を介して C/C++ クロスコンパイラーへのパスを指定する必要があります。
必要な実行可能ファイルが実行できるように {{ic|$PATH}} に {{ic|bin}} ディレクトリも追加します。
 
   
  +
{{ic|1=GOOS=linux}} と {{ic|1=GOARCH=arm64}} をクロスコンパイルしたいとします。
詳細は {{ic|go help gopath}} を実行してください。
 
   
=== 他のプラットフォームのクロスコンパイ有効にする ===
+
まず、{{Pkg|aarch64-linux-gnu-gcc}} クロスコンパイインストールする必要があります。
   
  +
以下は、クロスコンパイルプロセスをテストできるように cgo を必要とするサンプルプログラムです:
公式パッケージは Linux の amd64, i386, arm アーキテクチャしかサポートしていません。Darwin, FreeBSD, MS Windows などのクロスコンパイルをサポートするには、下の手順に従ってください。
 
   
  +
{{hc|hello.go|
{{ic|$GOROOT_BOOTSTRAP}} を {{ic|/usr/lib/go}} に設定すると {{ic|/usr/lib/go/src}} をビルドできません。以下のような警告が出力されます。
 
  +
package main
   
  +
// #include <stdio.h>
$ cd /usr/lib/go/src
 
  +
// void hello() { puts("Hello, Arch!"); }
$ GOROOT_BOOTSTRAP=/usr/lib/go GOOS=darwin GOARCH=amd64 ./make.bash --no-clean
 
  +
import "C"
##### Building Go bootstrap tool.
 
cmd/dist
 
ERROR: $GOROOT_BOOTSTRAP must not be set to $GOROOT
 
Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.
 
   
  +
func main() {
この問題を回避するには、https://golang.org/ から Go のソースを入手してください。
 
  +
C.hello()
  +
}
  +
}}
   
  +
次に、次のようにクロスコンパイルできます:
{{Note|以下のコマンドでは、{{ic|~/downloads/go}} に Go をダウンロードして解凍したものとします。}}
 
   
  +
$ GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=/usr/bin/aarch64-linux-gnu-gcc go build hello.go
ダウンロードした Go をビルド:
 
   
  +
生成されたバイナリのアーキテクチャが実際に aarch64 であることを確認できます:
$ cd ~/downloads/go/src
 
$ GOROOT_BOOTSTRAP=/usr/lib/go GOOS=linux GOARCH=amd64 ./make.bash --no-clean
 
   
  +
$ file hello
これでダウンロードした Go を使用して Go をビルドできるはずです。以下のコマンドでビルドしてください:
 
  +
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
   
  +
{{ic|hello}} を適切なホストにコピーすると、テスト実行できます:
$ cd /usr/lib/go/src; for os in darwin freebsd windows; do for arch in amd64 386; do sudo GOROOT_BOOTSTRAP="$HOME/downloads/go" GOOS=$os GOARCH=$arch ./make.bash --no-clean; done; done
 
   
  +
[alarm@rpi3 ~]$ uname -a
{{Note|上記のコマンドは Go パッケージをアップデートするたびに実行する必要があります。}}
 
  +
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 モジュールミラーの使用 ===
詳細は {{Bug|30287}} を参照。
 
  +
  +
デフォルトでは、Go は Google のサービス [https://proxy.golang.org/proxy.golang.org] をモジュールミラーとして使用します。
  +
  +
代替ミラーが必要な場合は、[[環境変数]] {{ic|GOPROXY}} を使用して変更できます。次に例を示します:
  +
  +
$ export GOPROXY=https://goproxy.io/
  +
  +
多数のパブリックモジュールミラーが利用可能です。[https://hugomods.com/en/blog/2023/04/go-and-hugo-proxy-servers/ Go および Hugo Proxy Servers] を参照してください。
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
   
 
=== Jetbrains の Go プラグイン ===
 
=== Jetbrains の Go プラグイン ===
  +
もし Jetbrains IDE を使用していて Go プラグインが Go SDK のパスを見つけられない場合、互換性のないパッケージを使用している可能性があります。{{ic|gcc-go}} パッケージを削除し、{{ic|go}} パッケージで置き換えてください。GOPATH が設定されている場合、IDE は {{ic|/usr/lib/go}} に存在する Go SDK を認識します。
 
  +
JetBrains IDE を使用していて、Go プラグインが Go SDK パスを見つけられない場合は、互換性のないパッケージを使用している可能性があります。gcc-go パッケージを削除し、go に置き換えます。{{ic|GOPATH}} が設定されている場合、IDE は {{ic|/usr/lib/go}} で Go SDK を見つけることができるはずです。
   
 
== 参照 ==
 
== 参照 ==

2024年4月26日 (金) 00:56時点における最新版

関連記事

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

参照