「Go」の版間の差分
(→インストール: 同期) |
(関連記事を同期) |
||
(3人の利用者による、間の12版が非表示) | |||
1行目: | 1行目: | ||
[[Category:プログラミング言語]] |
[[Category:プログラミング言語]] |
||
[[en:Go]] |
[[en: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, etc.) |
||
− | ** クロスコンパイル |
||
− | + | {{pkg|go}} パッケージには、''gc'' と呼ばれる標準 Go コンパイラが含まれています。次の代替コンパイラも使用できます。 |
|
− | ** goroutine がフルフローになる |
||
− | ** バイナリのサイズが小さい(dynamic linking) |
||
+ | ==== 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| |
||
31行目: | 69行目: | ||
}} |
}} |
||
− | go ツールを使 |
+ | 次に、''go'' ツールを使用して実行します: |
+ | |||
{{hc|$ go run hello.go| |
{{hc|$ go run hello.go| |
||
Hello, Arch! |
Hello, Arch! |
||
}} |
}} |
||
− | 標準 |
+ | 標準コンパイラによるコンパイル ({{ic|1=go build -compiler=gc hello.go}} と同じ): |
− | $ go build |
+ | $ go build hello.go |
− | ''gccgo'' |
+ | ''gccgo'' によるコンパイル ({{ic|1=go build -compiler=gccgo hello.go}} と同じ): |
− | $ gccgo |
+ | $ 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| |
||
− | You can not build {{ic|/usr/lib/go/src}} of itself, ie if you set {{ic|$GOROOT_BOOTSTRAP}} to {{ic|/usr/lib/go}} you will get a warning like this. |
||
+ | 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() { |
||
− | To get around this, grab a source copy of Go from https://golang.org/. |
||
+ | C.hello() |
||
+ | } |
||
+ | }} |
||
+ | 次に、次のようにクロスコンパイルできます: |
||
− | {{Note|Commands below will assume you extracted your download of Go to {{ic|~/downloads/go}}.}} |
||
+ | $ GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=/usr/bin/aarch64-linux-gnu-gcc go build hello.go |
||
− | Build your downloaded Go with your system GO. |
||
+ | 生成されたバイナリのアーキテクチャが実際に aarch64 であることを確認できます: |
||
− | $ cd ~/downloads/go/src |
||
− | $ GOROOT_BOOTSTRAP=/usr/lib/go GOOS=linux GOARCH=amd64 ./make.bash --no-clean |
||
+ | $ file hello |
||
− | You can now build your system Go using the downloaded Go as bootstrap with this command. |
||
+ | 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 を見つけることができるはずです。 |
||
== 参照 == |
== 参照 == |
||
108行目: | 160行目: | ||
* [http://tour.golang.org インタラクティブな Go トレーニングツアー] |
* [http://tour.golang.org インタラクティブな Go トレーニングツアー] |
||
* [https://github.com/golang/go/wiki/IDEsAndTextEditorPlugins Go の IDE とプラグイン] |
* [https://github.com/golang/go/wiki/IDEsAndTextEditorPlugins Go の IDE とプラグイン] |
||
+ | * [https://docs.google.com/document/d/1OaatvGhEAq7VseQ9kkavxKNAfepWy2yhPUBs96FGV28/edit Go 1.5 Bootstrap Plan] |
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 より高速なバイナリを生成し、追加のオペレーティングシステムやアーキテクチャをターゲットにすることができます。実際には、ほぼすべてのワークロードにおいて、gc は gccgo よりも高速なバイナリを生成します。
TinyGo
TinyGo は、組み込みシステムおよび WebAssembly 用の非常に小さなバイナリを生成するように設計された LLVM ベースのコンパイラです。これは、tinygo パッケージによって提供されます。
ツール
次のパッケージは Go 用の開発者ツールを提供します:
- Go ツール — 主に Go プログラムの静的解析のための様々なツールと Go パッケージ。
- gopls — 公式 Go 言語サーバ
- Delve — 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 を見つけることができるはずです。