Go: Go言語入門とインストール:なぜGoを学ぶのか、そして最初のGo開発環境をセットアップする方法
Goは、Googleで開発されたコンパイル型並行処理言語です。最小限の構文でエンジニアリング上の課題を解決し、「高速かつシンプル」というコンセプトを実現しています。
このチュートリアルは、経験のない初心者向けに作成されています。「Goとは何か」といった基礎から始まり、Goで最初のコマンドラインツールを作成して実行するまでの全過程を解説します。Goは、クラウドネイティブ(Docker/Kubernetes)、マイクロサービス、CLIツールの分野における事実上の標準であり、世界中で300万人以上の開発者に利用されています。
1. 学習内容
- Goとは何ですか?誰が開発したもので、どのような問題を解決するのでしょうか?
- GoとPython、Java、C++の主な違い
- Goの3つの設計哲学(シンプルさ、並行性、高速性)
- Windows、macOS、またはLinuxにGo 1.22以降をインストールする
- 初めての「Hello World」プログラムを書いてみましょう
go run/go build/go fmt—3つの基本コマンドgo mod init依存関係管理のシードを植え付ける(第8課:詳細編)
2. バックエンドエンジニアの実話
(1) 課題:並行負荷がかかるとPython APIがクラッシュする
アリスはバックエンドエンジニアですが、彼女がPythonで開発したAPIサービスで、最近問題が発生しています:
「オンラインイベント開催中、10,000件の同時リクエストが殺到し、APIの応答時間が100ミリ秒から8秒へと急増し、CPU使用率も95%に達しました。サービスはほぼダウン寸前でした。」
バックエンドのログを確認したところ、彼女は次のことを発見した。
- GILグローバルロック:Pythonの
threadingモジュールは、マルチコアCPUの性能を十分に活かすことができない - 非同期処理の複雑さ:
asyncio習得が難しく、コードの可読性が低い - メモリの急増:1リクエストあたり50 MBを使用するため、10,000件の同時リクエストがあると、500 GBのメモリが消費される
- プロセス切り替えの遅延:
multiprocessingに切り替えると、起動が遅くなり、通信オーバーヘッドが大きくなる
上司が彼女に「別のプログラミング言語に切り替えてみないか?」と尋ねた。少し調べてみた後、アリスはGoに目を付けた。
(2) Goの解答
アリスが同じビジネスロジックをGoで書き直した方法は以下の通りです:
// main.go
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello from Go!")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
パフォーマンス比較(同じビジネスシナリオにおける同時接続ユーザー数10,000人):
| ディメンション | Python Flask | Go net/http |
|---|---|---|
| 平均応答時間 | 2,500 ms | 45 ms |
| メモリ使用量 | 500GB | 1.2GB |
| CPU使用率 | シングルコア 95% | マルチコア 70% |
| 起動時間 | 5秒 | 20ミリ秒 |
| 展開方法 | Pythonランタイムが必要 | 単一バイナリ |
(3) メリット:なぜGoを学ぶ価値があるのか?
このレッスンを終えたら、最初のステップを踏み出しましょう:
- Goの設計思想を理解する:Goがどのような課題を解決しているかを把握し、やみくもにトレンドを追うことを避ける
- 開発環境のセットアップ:Windows、macOS、Linuxの中から選択してください。所要時間はわずか10分です。
- 「Hello World」を実行する:
Hello, World!の出力が表示された瞬間、コツをつかんだことになります。 - 3つの主要コマンドをマスターする:
go run/go build/go fmt— 日常の開発にはこれで十分です
3. Go言語とは何か?
Go(Golangとも呼ばれる)は、2009年にGoogleのRobert Griesemer、Rob Pike、Ken Thompsonによって設計されたオープンソースのコンパイル型言語です。この3人はいずれも、C言語およびUnixの中核的な貢献者です。
(1) Goが開発された背景
2007年、Googleは社内の問題に直面した:
- C++のコンパイルに時間がかかりすぎる:大規模なC++プロジェクトの完全なコンパイルに45分かかる
- 混沌とした依存関係管理:ヘッダーファイルのインクルードがもたらす悪夢――たった1行のコードを変更するだけで、プロジェクト全体に影響が及ぶ
- 並行プログラミングにおける課題:pthreads を使用して並行コードを記述すると、多くのバグが発生し、デバッグも困難になる。
- 大規模なチーム:数万人のエンジニアが協力して開発を行っているため、コーディングスタイルを統一することは困難です。
Goの目標は、最小限の構文でエンジニアリング上の課題を解決し、大規模なチーム間でも小規模なチームと同様に円滑なコラボレーションを実現することです。
(2) Goの3つの主要な設計理念
graph TB
A[Go Design Philosophy] --> B[Simplicity]
A --> C[Concurrency]
A --> D[Speed]
B --> B1[25 keywords<br/>No inheritance/No issues]
B --> B2[gofmt standard format<br/>No style debates in team code]
C --> C1[goroutine<br/>2KB stack, start 1μs]
C --> C2[channel<br/>CSP concurrency model]
D --> D1[Compiled<br/>Compilation in seconds, 20ms start]
D --> D2[Static link<br/>Single binary deployment]
(3) Goの代表的な応用分野
| 分野 | 代表的なプロジェクト | Goを選ぶ理由 |
|---|---|---|
| クラウドネイティブ | Docker、Kubernetes、Istio | 単一バイナリ、クロスプラットフォームコンパイル、低メモリ |
| マイクロサービス | Uber、Twitch、Dropbox | 高い同時実行性、組み込みのHTTP、充実した標準ライブラリ |
| CLIツール | gh (GitHub CLI)、hugo、cobra | 高速なコンパイル、クロスプラットフォーム、単一ファイルでの配布 |
| データベース | TiDB、CockroachDB、InfluxDB | 高性能、最適化されたガベージコレクション |
| DevOps | Terraform、Prometheus、Consul | 数百万件のメトリクスを並行処理 |
4. Goと他の言語との違い
(1) 言語ローカライゼーションの概要
graph TB
subgraph L[Division of Labor Among Programming Languages]
direction TB
G[Go<br/>Back-end Services/Cloud-native/CLI]
P[Python<br/>Data Science/AI/Script]
J[Java<br/>Enterprise-level/Android/Big Data]
C[C++<br/>Games/System Software/Embedded]
R[Rust<br/>System-level/Embedded/Security-sensitive]
end
(2) Go 対 Python 対 Java 対 C++
| 次元 | Go | Python | Java | C++ |
|---|---|---|---|---|
| 型システム | 静的、強型 | 動的、強型 | 静的、強型 | 静的、強型 |
| コンパイル | コンパイル済み (秒) | インタプリタ実行 | コンパイル済み (低速) | コンパイル済み (超低速) |
| 並行処理モデル | ゴルーチン(軽量) | スレッド(GILによる制限あり) | スレッド | スレッド |
| メモリ使用量 | 低 (1~2 MB) | 高 (50~200 MB) | 高 (100~500 MB) | 中 (10~50 MB) |
| 習得の難易度 | 緩やか | 最も簡単 | 急 | 非常に急 |
| デプロイメント | 単一バイナリ | 必要なランタイム | 必要なJRE | コンパイル済み出力が必要 |
| 代表的なシナリオ | バックエンド/クラウドネイティブ | データサイエンス/AI | エンタープライズアプリケーション | システムソフトウェア |
(3) Goの「弱点」についても知っておくべきです
- ジェネリックの歴史は浅い:Goではバージョン1.18になるまでジェネリックが導入されなかったため、レガシープロジェクトのメンテナンス担当者は苦労している
- 詳細なエラー処理:
if err != nil { return err }これを100回書くのが普通だ - try/catchによる例外処理なし:
errorの戻り値とpanic/recoverに依存する - 比較的新しいエコシステム:ライブラリの品質にはばらつきがあり、分野によってはPythonやJavaの方が無難な選択となる
5. Goのインストール
(1) ダウンロードリンク
公式ダウンロードリンク:https://go.dev/dl/
| プラットフォーム | インストーラー | サイズ |
|---|---|---|
| Windows | go1.22.x.windows-amd64.msi |
約150MB |
| macOS (Intel) | go1.22.x.darwin-amd64.pkg |
約150MB |
| macOS (Apple Silicon) | go1.22.x.darwin-arm64.pkg |
約150MB |
| Linux x86_64 | go1.22.x.linux-amd64.tar.gz |
約70MB |
| Linux ARM64 | go1.22.x.linux-arm64.tar.gz |
約70MB |
▶ サンプル:Windows での Go のグラフィカルインストール
# Steps 1: Double-click go1.22.x.windows-amd64.msi
# Steps 2: All the Way Next (Installed by default to C:\Program Files\Go)
# Steps 3: Check the box "Add Go to PATH" (Automatically Configure Environment Variables)
# Steps 4: Finish
# Steps 5: Verify Installation
go version
出力:
go version go1.22.x windows/amd64
▶ サンプル:macOSへのHomebrewのインストール
# Steps 1: Install Homebrew (If you haven't installed it yet)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Steps 2: Installation Go
brew install go
# Steps 3: Verification
go version
出力:
go version go1.22.x darwin/arm64
▶ サンプル:Linux での手動での抽出とインストール
# Steps 1: Download (Using 1.22.x as an example)
wget https://go.dev/dl/go1.22.x.linux-amd64.tar.gz
# Steps 2: Extract to /usr/local
sudo tar -C /usr/local -xzf go1.22.x.linux-amd64.tar.gz
# Steps 3: Configure PATH (Write to ~/.bashrc or ~/.zshrc)
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
# Steps 4: Verification
go version
出力:
go version go1.22.x linux/amd64
(5) 環境変数の確認
| 変数 | 意味 | デフォルト値 |
|---|---|---|
GOROOT |
Goのインストールディレクトリ | /usr/local/go (Linux) / C:\Program Files\Go (Windows) |
GOPATH |
ワークスペースディレクトリ | ~/go |
PATH |
実行ファイルのパス | $GOROOT/bin を含めること |
6. 最初の「Hello World」プログラム
(1) 作業ディレクトリを作成する
mkdir hello-go
cd hello-go
(2) main.go を作成する
# At hello-go, create a file in the directory
cat > main.go << 'EOF'
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
fmt.Println("Welcome to Go programming!")
}
EOF
▶ サンプル:go run (開発中に)直接実行
go run main.go
出力:
Hello, World!
Welcome to Go programming!
go runはコンパイルして実行できますが、バイナリファイルは保存されません。開発やデバッグに適しています。
▶ サンプル:go build バイナリへのコンパイル(本番環境へのデプロイ)
go build -o hello main.go
# Run the generated binary
./hello # Linux/macOS
hello.exe # Windows
go build 同じアーキテクチャのサーバーであればどこにでも直接コピーでき、Goランタイムをインストールすることなく実行できる単一の実行ファイルを生成します。
▶ サンプル:gofmt コードの自動フォーマット
# Format all .go files in the current directory
gofmt -w .
# Check that the format is correct (do not modify)
gofmt -l .
gofmt は Go チームの「コードスタイルの監視役」です。すべての Go コードは gofmt のチェックに合格しなければならず、スタイルに関する議論の余地は一切ありません。
7. go mod init:依存関係管理の基盤づくり
包括的な依存関係管理については、第8課:errors-packagesで詳しく解説しています。ここでは、
go.modファイルとは何かを理解するための基礎を築いていきます。
(1) なぜ依存関係管理が必要なのでしょうか?
プロジェクトでサードパーティのライブラリを使用していると仮定しましょう。それをどのように宣言しますか?どのようにアップグレードしますか?チームメンバー全員が同じバージョンを使用していることを、どのように確認しますか?
Goの回答:go.mod ファイル + go mod コマンド。
▶ サンプル:go mod init プロジェクトを作成する
# Run the following command in the project's root directory
cd hello-go
go mod init hello-go
出力:
go: creating new go.mod: module hello-go
go: now you can use 'go get' to add dependencies
生成された go.mod ファイル:
module hello-go
go 1.22
(3) この2行のコードの意味
| 項目 | 意味 |
|---|---|
module hello-go |
モジュール名(プロジェクトのドメイン名を逆順にすることを推奨します。このチュートリアルではプロジェクト名を使用しています) |
go 1.22 |
Goの最低バージョン要件 |
go get、go mod tidy、go.sumといった高度なコマンドを学び、サードパーティ製ライブラリ(ginやgormなど)をプロジェクトに組み込む方法を習得します。
8. 完全な例:初めてのGoコマンドラインツール
以上の知識をすべて活用して、簡単な個人情報カードというCLIツールを作成してみましょう。
# Steps 1: Create a project directory
mkdir my-card && cd my-card
# Steps 2: Initialize module
go mod init my-card
# Steps 3: Write code
cat > main.go << 'EOF'
package main
import "fmt"
func main() {
// Define a variable
name := "Alice"
role := "Backend Engineer"
yearsOfExperience := 5
// Print Card
fmt.Println("========================================")
fmt.Println(" Personal Card CLI")
fmt.Println("========================================")
fmt.Printf("Name: %s\n", name)
fmt.Printf("Role: %s\n", role)
fmt.Printf("Years of Experience: %d\n", yearsOfExperience)
fmt.Printf("Language: Go %s\n", "1.22+")
fmt.Println("========================================")
}
EOF
# Steps 4: Run
go run main.go
# Steps 5: Compile into an executable file
go build -o card main.go
./card
期待される出力:
========================================
Personal Card CLI
========================================
Name: Alice
Role: Backend Engineer
Years of Experience: 5
Language: Go 1.22+
========================================
package main を package Main と記述しないでください(Go 言語は大文字と小文字を区別します)。func main() はプログラムのエントリポイントであり、名前を変更することはできません。
❓ よくある質問
go version が「command not found」と表示された場合はどうすればよいですか?source ~/.bashrc(または~/.zshrc)を実行してください。それでも解決しない場合は、$GOROOT/binが$PATHに含まれているか確認してください:echo $PATH | grep go。mux.HandleFunc("GET /path/{id}", h)、(2) for-range 整数ループ for i := range 10、(3) メモリモデルの最適化。このチュートリアルは Go 1.22 以降を前提としています。go run と go build の違いは何ですか?go run = コンパイル + 実行 + 中間ファイルのクリーンアップ(開発用);go build = コンパイルのみ、実行ファイルの生成(本番環境へのデプロイ用)。go runでは.exeファイルは保持されませんが、go buildでは保持されます。📖 まとめ
- Goは、2009年にGoogleによってリリースされたコンパイル型言語であり、大規模なエンジニアリング・コラボレーションを特に念頭に置いて設計されています。
- 3つの主要な設計理念:シンプルさ(25のキーワード+gofmt)、並行性(goroutine+チャネル)、高速性(数秒でのコンパイル+単一のバイナリ)
- 代表的な活用例:クラウドネイティブ(Docker/K8s)、マイクロサービス、CLIツール、データベース
- Go 対 Python/Java/C++:パフォーマンスが 30~100 倍高速で、メモリ使用量は 30 分の 1、並行処理をネイティブにサポート
- インストール:公式ダウンロードページ
go.dev/dlでは、Windows、macOS、Linux 用のインストールパッケージが提供されています。 - 3つの基本コマンド:
go run(実行) /go build(コンパイル) /go fmt(フォーマット) go mod initモジュールを初期化し、プロジェクトのメタデータを宣言するためのgo.modファイルを生成する
📝 練習問題
-
基本演習(難易度 ⭐):ローカルに Go 1.22 以降をインストールし、
go versionを実行して、スクリーンショットを撮って確認してください。また、hello.goを実行して「Hello, Go!」と出力させてください。 -
上級問題(難易度 ⭐⭐):上記の「Personal Card CLI」を拡張し、変数
city := "Shanghai"とhobby := "Coding"を追加して、カードの末尾に次の2行を追加してください。最後に、go buildを使用して実行ファイルにコンパイルしてください。 -
課題(難易度:⭐⭐⭐):普段よく使っているコマンドラインツール(例:
git/docker/kubectlなど)を1つ調べて、それがGo言語で書かれているかどうかを確認してください。Goで書かれている場合は、「なぜGoがCLIツールに適しているのか」を説明する200文字のエッセイを書いてください(ヒント:クロスプラットフォームコンパイル、単一のバイナリ、高速な起動)。