Go

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

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

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 ランタイムが管理する軽量スレッドだ。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 との比較

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

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

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

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

関連用語

関連する記事