「Go」の版間の差分
(Created page with "Category:プログラミング言語 en:Go ru:Go [http://golang.org/ Go] は C 言語に由来する構文を持つ静的型付言語です。ガベージコ...") |
(関連記事を同期) |
||
(3人の利用者による、間の18版が非表示) | |||
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つ存在しており、どちらも[[公式リポジトリ]]から[[インストール]]できます: |
||
+ | === 代替コンパイラ === |
||
− | * '''gc''': {{pkg|go}} で[[インストール]]できるコンパイラの公式セット 8g(x86), 6g(amd64), 5g(arm) の共通名称 |
||
− | ** コンパイルが高速 |
||
− | * '''gccgo''': {{pkg|gcc-go}} で[[インストール]]できるコンパイラコレクションに含まれている ''gcc'' のフロントエンド |
||
− | ** goroutines に制限がある |
||
− | ** バイナリのサイズが小さい |
||
− | ** 優れた最適化 |
||
+ | {{pkg|go}} パッケージには、''gc'' と呼ばれる標準 Go コンパイラが含まれています。次の代替コンパイラも使用できます。 |
||
− | === インストールのテスト === |
||
+ | ==== gccgo ==== |
||
− | Go が正しくインストールされたかは以下のような小さなプログラムをビルドして確認できます: |
||
+ | |||
+ | [[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'' よりも高速なバイナリを生成します。] |
||
+ | |||
+ | ==== 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| |
||
29行目: | 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 hello.go |
||
+ | |||
+ | ''gccgo'' によるコンパイル ({{ic|1=go build -compiler=gccgo hello.go}} と同じ): |
||
+ | |||
+ | $ gccgo hello.go -o hello |
||
+ | |||
+ | ''tinygo'' でのコンパイル: |
||
+ | |||
+ | $ tinygo build -o hello ./hello.go |
||
+ | |||
+ | === 他のプラットフォームへのクロスコンパイル === |
||
+ | |||
+ | 標準コンパイラは、[https://go.dev/doc/install/source#introduction 多くのプラットフォーム] に対してネイティブにクロスコンパイルできます。手順は、ソースコードが [https://pkg.go.dev/cmd/cgo cgo] を使用して C コードを呼び出すかどうかによって異なります。 |
||
+ | |||
+ | ==== cgo なし ==== |
||
+ | |||
+ | ビルドに cgo が必要ない場合は、ターゲット OS とアーキテクチャを [[環境変数]] として {{ic|go build}} に指定するだけです。 |
||
+ | |||
+ | $ GOOS=linux GOARCH=arm64 go build . |
||
+ | |||
+ | {{ic|GOOS}} と {{ic|GOARCH}} の有効な組み合わせについては、[https://go.dev/doc/install/source#environment 公式ドキュメント] を参照してください。 |
||
+ | |||
+ | ==== cgo あり ==== |
||
+ | |||
+ | ビルドに cgo が必要な場合は、{{ic|CC}}/{{ic|CXX}} 環境変数を介して C/C++ クロスコンパイラーへのパスを指定する必要があります。 |
||
+ | |||
+ | {{ic|1=GOOS=linux}} と {{ic|1=GOARCH=arm64}} をクロスコンパイルしたいとします。 |
||
+ | |||
+ | まず、{{Pkg|aarch64-linux-gnu-gcc}} クロスコンパイラをインストールする必要があります。 |
||
+ | |||
+ | 以下は、クロスコンパイルプロセスをテストできるように cgo を必要とするサンプルプログラムです: |
||
+ | |||
+ | {{hc|hello.go| |
||
+ | package main |
||
+ | |||
+ | // #include <stdio.h> |
||
+ | // void hello() { puts("Hello, Arch!"); } |
||
+ | import "C" |
||
+ | |||
+ | func main() { |
||
+ | C.hello() |
||
+ | } |
||
+ | }} |
||
+ | 次に、次のようにクロスコンパイルできます: |
||
− | $ go build test.go |
||
+ | $ GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=/usr/bin/aarch64-linux-gnu-gcc go build hello.go |
||
− | ''gccgo'' でコンパイル ({{ic|1=go build -compiler=gccgo test.go}} と同じ): |
||
+ | 生成されたバイナリのアーキテクチャが実際に aarch64 であることを確認できます: |
||
− | $ gccgo test.go -o test |
||
+ | $ file hello |
||
− | === $GOPATH === |
||
+ | 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}} を適切なホストにコピーすると、テスト実行できます: |
||
− | {{ic|import}} ステートメントなどで使用される、Go の依存パッケージは、{{ic|$GOPATH}} 変数、そして {{ic|$GOROOT}} (''go'' のインストールディレクトリ、デフォルトでは {{ic|/usr/lib/go}}) で検索されます。基本の {{ic|$GOROOT}} からだけでなく、外部の依存パッケージを使う場合は、{{ic|~/.bash_profile}} (もしくはそれに類する設定ファイル) にワークスペースを指定する必要があります: |
||
+ | [alarm@rpi3 ~]$ uname -a |
||
− | export GOPATH=~/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 モジュールミラーの使用 === |
||
− | {{Tip|{{ic|go env}} を実行することで Go の変数を確認できます。}} |
||
+ | デフォルトでは、Go は Google のサービス [https://proxy.golang.org/proxy.golang.org] をモジュールミラーとして使用します。 |
||
− | ワークスペースを作成: |
||
+ | 代替ミラーが必要な場合は、[[環境変数]] {{ic|GOPROXY}} を使用して変更できます。次に例を示します: |
||
− | $ mkdir -p ~/go/{bin,src} |
||
+ | $ export GOPROXY=https://goproxy.io/ |
||
− | プロジェクトのソースの保存には {{ic|src}} ディレクトリが、実行可能ファイルには {{ic|bin}} が使われます。 |
||
+ | 多数のパブリックモジュールミラーが利用可能です。[https://hugomods.com/en/blog/2023/04/go-and-hugo-proxy-servers/ Go および Hugo Proxy Servers] を参照してください。 |
||
− | また、{{ic|bin}} ディレクトリのパスを {{ic|$PATH}} [[environment variable|環境変数]]に追加することで (Go 言語で書かれた) インストールしたプログラムを ({{ic|ls}} などと同じように) どこでも実行できるようになります: |
||
+ | == トラブルシューティング == |
||
− | export PATH="$PATH:$GOPATH/bin" |
||
+ | === Jetbrains の Go プラグイン === |
||
− | 必要な実行可能ファイルが実行できるように {{ic|$PATH}} に {{ic|bin}} ディレクトリも追加します。 |
||
+ | JetBrains IDE を使用していて、Go プラグインが Go SDK パスを見つけられない場合は、互換性のないパッケージを使用している可能性があります。gcc-go パッケージを削除し、go に置き換えます。{{ic|GOPATH}} が設定されている場合、IDE は {{ic|/usr/lib/go}} で Go SDK を見つけることができるはずです。 |
||
− | 詳細は {{ic|go help gopath}} を実行してください。 |
||
== 参照 == |
== 参照 == |
||
70行目: | 159行目: | ||
* [https://gobyexample.com/ 簡単な説明が付いているサンプル] |
* [https://gobyexample.com/ 簡単な説明が付いているサンプル] |
||
* [http://tour.golang.org インタラクティブな Go トレーニングツアー] |
* [http://tour.golang.org インタラクティブな Go トレーニングツアー] |
||
+ | * [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 を見つけることができるはずです。