Go: Go言語入門とインストール:なぜGoを学ぶのか、そして最初のGo開発環境をセットアップする方法

Goは、Googleで開発されたコンパイル型並行処理言語です。最小限の構文でエンジニアリング上の課題を解決し、「高速かつシンプル」というコンセプトを実現しています。

このチュートリアルは、経験のない初心者向けに作成されています。「Goとは何か」といった基礎から始まり、Goで最初のコマンドラインツールを作成して実行するまでの全過程を解説します。Goは、クラウドネイティブ(Docker/Kubernetes)、マイクロサービス、CLIツールの分野における事実上の標準であり、世界中で300万人以上の開発者に利用されています。

1. 学習内容



2. バックエンドエンジニアの実話

(1) 課題:並行負荷がかかるとPython APIがクラッシュする

アリスはバックエンドエンジニアですが、彼女がPythonで開発したAPIサービスで、最近問題が発生しています:

「オンラインイベント開催中、10,000件の同時リクエストが殺到し、APIの応答時間が100ミリ秒から8秒へと急増し、CPU使用率も95%に達しました。サービスはほぼダウン寸前でした。」

バックエンドのログを確認したところ、彼女は次のことを発見した。

上司が彼女に「別のプログラミング言語に切り替えてみないか?」と尋ねた。少し調べてみた後、アリスはGoに目を付けた。

(2) Goの解答

アリスが同じビジネスロジックを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を学ぶ価値があるのか?

このレッスンを終えたら、最初のステップを踏み出しましょう:



3. Go言語とは何か?

Go(Golangとも呼ばれる)は、2009年にGoogleのRobert GriesemerRob PikeKen Thompsonによって設計されたオープンソースのコンパイル型言語です。この3人はいずれも、C言語およびUnixの中核的な貢献者です。

(1) Goが開発された背景

2007年、Googleは社内の問題に直面した:

Goの目標は、最小限の構文でエンジニアリング上の課題を解決し、大規模なチーム間でも小規模なチームと同様に円滑なコラボレーションを実現することです。

(2) Goの3つの主要な設計理念

100%
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 数百万件のメトリクスを並行処理
💡 ヒント: Docker や Kubernetes を聞いたことがあるなら、それらのコアコードは Go 言語で書かれています。Go 言語は、クラウドネイティブ時代の「ネイティブ言語」です。



4. Goと他の言語との違い

(1) 言語ローカライゼーションの概要

100%
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は万能な言語ではありません。Webフロントエンド開発にはJavaScriptを、データ分析にはPythonを、モバイル開発にはKotlinやSwiftを使用してください。Goはサーバーサイド、CLI、およびクラウドネイティブのアプリケーションに特化しています。



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 のグラフィカルインストール

BASH
# 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

出力:

TEXT 📖 参照専用
go version go1.22.x windows/amd64

▶ サンプル:macOSへのHomebrewのインストール

BASH
# 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

出力:

TEXT 📖 参照専用
go version go1.22.x darwin/arm64

▶ サンプル:Linux での手動での抽出とインストール

BASH
# 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

出力:

TEXT 📖 参照専用
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) 作業ディレクトリを作成する

BASH
mkdir hello-go
cd hello-go

(2) main.go を作成する

BASH
# 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 (開発中に)直接実行

BASH
go run main.go

出力:

TEXT 📖 参照専用
Hello, World!
Welcome to Go programming!

go runコンパイルして実行できますが、バイナリファイルは保存されません。開発やデバッグに適しています。

▶ サンプル:go build バイナリへのコンパイル(本番環境へのデプロイ)

BASH
go build -o hello main.go

# Run the generated binary
./hello    # Linux/macOS
hello.exe  # Windows

go build 同じアーキテクチャのサーバーであればどこにでも直接コピーでき、Goランタイムをインストールすることなく実行できる単一の実行ファイルを生成します。

▶ サンプル:gofmt コードの自動フォーマット

BASH
# 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 プロジェクトを作成する

BASH
# Run the following command in the project's root directory
cd hello-go
go mod init hello-go

出力:

TEXT 📖 参照専用
go: creating new go.mod: module hello-go
go: now you can use 'go get' to add dependencies

生成された go.mod ファイル:

TEXT 📖 参照専用
module hello-go

go 1.22

(3) この2行のコードの意味

項目 意味
module hello-go モジュール名(プロジェクトのドメイン名を逆順にすることを推奨します。このチュートリアルではプロジェクト名を使用しています)
go 1.22 Goの最低バージョン要件
💡 ヒント: レッスン8では、go getgo mod tidygo.sumといった高度なコマンドを学び、サードパーティ製ライブラリ(gingormなど)をプロジェクトに組み込む方法を習得します。



8. 完全な例:初めてのGoコマンドラインツール

以上の知識をすべて活用して、簡単な個人情報カードというCLIツールを作成してみましょう。

BASH
# 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

期待される出力:

TEXT 📖 参照専用
========================================
         Personal Card CLI
========================================
Name:               Alice
Role:               Backend Engineer
Years of Experience: 5
Language:           Go 1.22+
========================================
🔥 よくある間違い: package mainpackage Main と記述しないでください(Go 言語は大文字と小文字を区別します)。func main() はプログラムのエントリポイントであり、名前を変更することはできません。


❓ よくある質問

Q GoとGolangの関係はどのようなものですか?
A Goの正式名称は「Go」ですが、「Go」という名称はあまりにも一般的すぎて情報を探しにくいため、コミュニティでは一般的に「Golang」という別名が使われています(ドメイン golang.org でもこの名称が使用されています)。この2つの用語は完全に同義であり、どちらを使っても構いません。
Q Goはどのような用途に最も適していますか?
A Goの強みはサーバーサイド開発にあります。具体的には、APIやマイクロサービス、CLIツール、クラウドネイティブアプリケーション(DockerやK8sはいずれもGoで記述されています)、データベース、メッセージキューなどです。Goは、デスクトップGUI、モバイルアプリ、フロントエンド開発、ゲームエンジンにはあまり適していません(これらの分野には他の言語の方が適しています)。
Q GoとPythonのパフォーマンスにはどれほどの差がありますか?
A CPU負荷の高いタスクでは、Goは通常Pythonよりも30~100倍高速です。I/O負荷の高いタスクでは、goroutineを使用した場合、10~50倍高速になることがあります。この差は、コンパイル型とインタプリタ型の違い、goroutineとGILの違い、および強型付けによる最適化に起因しています。
Q インストール後に go version が「command not found」と表示された場合はどうすればよいですか?
A これは通常、PATH が設定されていないことが原因です。Windowsの場合は、ターミナルを再起動するか、一度ログアウトして再度ログインしてください。Linux/macOSの場合は、source ~/.bashrc(または~/.zshrc)を実行してください。それでも解決しない場合は、$GOROOT/bin$PATHに含まれているか確認してください:echo $PATH | grep go
Q Go 1.22 とそれ以前のバージョンには大きな違いがありますか?
A Go 1.22 では、次の 3 つの大きな変更が導入されました:(1) HTTP ルーティングの機能強化 mux.HandleFunc("GET /path/{id}", h)、(2) for-range 整数ループ for i := range 10、(3) メモリモデルの最適化。このチュートリアルは Go 1.22 以降を前提としています。
Q Goを学ぶ前にCを学ぶ必要がありますか?
A いいえ。Goの設計目標の一つは「C++よりもシンプルであること」です。どのプログラミング言語(Python、Java、JavaScriptなど、どれでも構いません)の基礎的な知識さえあれば、すぐにGoの学習を始めることができます。Goのキーワードはわずか25個しかなく、ほとんどの言語よりも少ないです。
Q go rungo build の違いは何ですか?
A go run = コンパイル + 実行 + 中間ファイルのクリーンアップ(開発用);go build = コンパイルのみ、実行ファイルの生成(本番環境へのデプロイ用)。go runでは.exeファイルは保持されませんが、go buildでは保持されます。

📖 まとめ


📝 練習問題

  1. 基本演習(難易度 ⭐):ローカルに Go 1.22 以降をインストールし、go version を実行して、スクリーンショットを撮って確認してください。また、hello.go を実行して「Hello, Go!」と出力させてください。

  2. 上級問題(難易度 ⭐⭐):上記の「Personal Card CLI」を拡張し、変数 city := "Shanghai"hobby := "Coding" を追加して、カードの末尾に次の2行を追加してください。最後に、go build を使用して実行ファイルにコンパイルしてください。

  3. 課題(難易度:⭐⭐⭐):普段よく使っているコマンドラインツール(例:git / docker / kubectlなど)を1つ調べて、それがGo言語で書かれているかどうかを確認してください。Goで書かれている場合は、「なぜGoがCLIツールに適しているのか」を説明する200文字のエッセイを書いてください(ヒント:クロスプラットフォームコンパイル、単一のバイナリ、高速な起動)。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%