Go

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

並行処理クラウド

Go とは

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

Go の特徴

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

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 ランタイムが管理する軽量スレッドだ。1 つの goroutine のスタックは数 KB で、数百万の goroutine を同時に実行できる。

エラーハンドリング

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 との比較

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

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

関連用語