Go

Google が開発したシンプルで高速なコンパイル言語で、goroutine による軽量な並行処理が特徴

並行処理クラウド
Go」の技術書を見る →

Go とは

Go (Golang) は、Google が 2009 年に公開したコンパイル言語で、Robert Griesemer、Rob Pike、Ken Thompson が設計した。シンプルな構文、高速なコンパイル、goroutine による軽量な並行処理が特徴だ。DockerKubernetesTerraform、Hugo、esbuild が Go で書かれている。

Go の特徴

Go は継承を持たないシンプルな構文で、ジェネリクスは 1.18 で追加された。例外機構はなく、エラーは値として返す。大規模プロジェクトでも数秒でビルドが完了する高速なコンパイルが特徴で、goroutine により数十万規模の軽量スレッドを同時実行できる。依存なしの単一バイナリを生成するためコンテナとの相性が良く、低レイテンシのガベージコレクションを備える。HTTP サーバー、JSON暗号化が標準ライブラリに揃っている。

goroutine と channel

goroutine と channel のコード例を示す。

func main() {
    ch := make(chan string)

    // goroutine: 軽量スレッド (数 KB のスタック)
    go func() {
        result := fetchData("https://api.example.com")
        ch <- result  // channel に送信
    }()

    data := <-ch  // channel から受信 (ブロック)
    fmt.Println(data)
}

goroutine は OS スレッドではなく、Go ランタイムが管理する軽量スレッドだ。スタックは数 KB から始まり、必要に応じてランタイムが伸縮させる。公式 FAQ が「同一アドレス空間に数十万の goroutine を作るのは実用的」と述べる桁で、これが OS スレッドなら先に資源が尽きる。

エラーハンドリング

Go は例外 (try/catch) を使わず、エラーを値として返す。

func getUser(id string) (*User, error) {
    user, err := db.FindUser(id)
    if err != nil {
        return nil, fmt.Errorf("failed to get user %s: %w", id, err)
    }
    return user, nil
}

// 呼び出し側: エラーを明示的にチェック
user, err := getUser("123")
if err != nil {
    log.Fatal(err)
}

Lambda での Go

Go は Lambda のカスタムランタイム (provided.al2023) で実行する。コールドスタートが極めて速い (数十ミリ秒)。

func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    return events.APIGatewayProxyResponse{
        StatusCode: 200,
        Body:       `{"message": "Hello from Go"}`,
    }, nil
}

func main() {
    lambda.Start(handler)
}

TypeScript/Node.js との比較

TypeScript/Node.js との主な違いを以下に比較する。

観点GoTypeScript/Node.js
型システム静的型付け (コンパイル時)静的型付け (トランスパイル時)
並行処理goroutine (マルチスレッド)イベントループ (シングルスレッド)
パフォーマンス高い (ネイティブバイナリ)中程度 (V8 JIT)
Lambda コールドスタート極めて速い (数十 ms)速い (数百 ms)
エコシステム標準ライブラリ中心npm (公開パッケージ 400 万超・2026 年 8 月時点)
学習コスト低い (シンプルな構文)中程度 (JS + 型システム)

Go の関連書籍も参考になる。

この記事は役に立ちましたか?

関連用語

関連する記事