0Pricing
Go Academy · レッスン

型パラメーターの構文

[T any]によるジェネリック関数とジェネリック型

「型パラメーターの構文」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

ジェネリクスの背景

Go 1.18より前は、複数の型で動作するコードを書くには、interface{}/any(型安全性を失います)かコード生成が必要でした。ジェネリクスによって型パラメーターが追加され、コンパイル時のポリモーフィズムを利用できるようになりました。

ジェネリック関数の構文

関数名の後に角括弧で型パラメーターを宣言します:

func Map[T, U any](s []T, f func(T) U) []U {
    result := make([]U, len(s))
    for i, v := range s {
        result[i] = f(v)
    }
    return result
}

nums := Map([]int{1,2,3}, func(n int) string {
    return strconv.Itoa(n)
})

型推論

ほとんどの場合、コンパイラは関数の引数から型引数を推論します。推論できない場合は、型引数を明示的に指定できます。

// Inferred:
nums := Map([]int{1,2,3}, strconv.Itoa)
// Explicit:
nums := Map[int, string]([]int{1,2,3}, strconv.Itoa)

ジェネリック型

構造体などの型にも型パラメーターを指定できます:

type Stack[T any] struct {
    items []T
}
func (s *Stack[T]) Push(v T) { s.items = append(s.items, v) }
func (s *Stack[T]) Pop() (T, bool) {
    if len(s.items) == 0 { var zero T; return zero, false }
    n := len(s.items)-1
    v := s.items[n]
    s.items = s.items[:n]
    return v, true
}

複数の型パラメーター

関数や型には複数の型パラメーターを指定できます:

type Pair[K, V any] struct { Key K; Value V }

func Zip[K, V any](keys []K, vals []V) []Pair[K, V] {
    result := make([]Pair[K, V], min(len(keys), len(vals)))
    for i := range result {
        result[i] = Pair[K, V]{keys[i], vals[i]}
    }
    return result
}

型パラメーターのゼロ値

var zero Tでゼロ値の変数を宣言します。ジェネリック関数から「値なし」の結果を返す場合に必要です。

func First[T any](s []T) (T, bool) {
    if len(s) == 0 { var zero T; return zero, false }
    return s[0], true
}

ジェネリック型のメソッド

ジェネリック型のメソッドでは、独自の型パラメーターではなく、その型のパラメーターを使います。メソッドで追加の型パラメーターを導入することはできません。

type Pair[K, V any] struct{ K K; V V }
func (p Pair[K, V]) Swap() Pair[V, K] { return Pair[V, K]{p.V, p.K} }

インスタンス化

具体的な型引数を指定してジェネリック型を使うことを、インスタンス化と呼びます。これは実行時ではなくコンパイル時に行われるため、ボックス化のオーバーヘッドはありません。

s := Stack[int]{}
s.Push(42)

型エイリアスとジェネリック型

インスタンス化したジェネリック型の型エイリアスを作成できます:

type IntStack = Stack[int]

制限事項

型パラメーターを型switchや型アサーションで使うことはできません。ジェネリック型のメソッドに追加の型パラメーターを指定することもできません。制約なしでは、演算子オーバーロードされた型にジェネリクスを使うことはできません。

ジェネリクスを使う場面

型に依存しないアルゴリズム(コンテナー型やMap/Filter/Reduceのような関数型ヘルパーなど)で、代替手段がコードの重複や安全でないキャストになる場合にジェネリクスを使います。

クイックチェック

ジェネリック関数では、型パラメーターをどこで宣言しますか?

まとめ: 型パラメーターの構文

重要事項:

  • 型パラメーターは角括弧で指定します: func Foo[T any](...)
  • 関数と型(構造体など)で利用できます
  • ほとんどの場合、コンパイラは引数から型引数を推論します
  • ゼロ値はvar zero Tで表し、メソッドレベルの型パラメーターはありません

よくある質問

「型パラメーターの構文」レッスンは無料ですか?

はい。「型パラメーターの構文」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「型パラメーターの構文」で何を学びますか?

[T any]によるジェネリック関数とジェネリック型 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「型パラメーターの構文」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 型パラメーターの構文
  2. 制約:comparableとインターフェース
  3. ジェネリックデータ構造
  4. 実践ジェネリクス:注意点
← Go Academyに戻る