TL;DR

  • Go の型と関数の宣言に、省略できる型パラメータを加える提案である。
  • 型パラメータの制約はインタフェース型で表し、Go 1 と完全に後方互換になる。Go 1.18 で入る予定として受け入れられた。

内容

型パラメータの書き方

関数と型は、通常の引数の前に、角かっこで囲んだ型パラメータのリストを持てる。

Functions can have an additional type parameter list that uses square brackets

制約と型集合

型パラメータにはそれぞれ制約があり、提案では「constraints are simply interface types」としている。あらかじめ宣言された any はどんな型も許す。制約は許される型の集合(型集合)を決める。要素には、ふつうの型、基底型が T の型すべてに当てはまる ~T、それらの和集合を書ける。ジェネリックな関数の中で使える演算は、型集合のすべての型が許す演算だけである。あらかじめ宣言された comparable は比較できる型に == と != を許す制約である。

型推論

関数の引数から型引数を推論し、構造的な制約から残りの型引数を推論する。そのため、よくある呼び出しでは型引数を省略できる。

ジェネリックな型とメソッド

型もパラメータ化でき、メソッドを持てる。レシーバでは型パラメータを制約なしで宣言する。メソッドは型の型パラメータを使えるが、メソッド自身が型パラメータを追加することはできない。

実装と、入れないもの

提案は特定の実装方法を決めず、型引数ごとにコンパイルする方法も、インタフェースのようにメソッドを呼び分ける方法も取れるようにしている。特殊化、メタプログラミング、可変長の型パラメータ、演算子メソッド、型以外の値によるパラメータ化には対応しない。

キーワード