8. Generics
02. GoにおけるGenerics
// 定義
func Map[E, T any](s []E, f func(E) T) []T {
r := make([]T2, len(s))
for i, v := range s {
r[i] = f(v)
}
return r
}
/*
Goの特徴として,型名を変数名の後ろに書く.
GenericsはGo2で実装されると噂されていたが,Go1で実装される
ことが決定した.
*/
今年1月にAcceptされた.
山括弧<T>ではなく
角括弧[T]が採用さ
れた.
29. // この形式は構文エラーにはならないが,サポートされない.
func (S) Identity[T any](v T) T { return v }
// Interfaceは許される
type Identify[T any] interface {
Identity(v T) T
}
// レシーバメソッドに型パラメータを持たない場合は許される
type Slice[T any] []T
func (s Slice[T]) Identity(v T) T { return v }
Genericsデモ
04. これからのGo
No parameterized methods
Interfaceや型定義
に型パラメータを持
たせる記述は可能.
32. // 並べられるという制約を定義
type Ordered interface {
// 型を列挙できる
// 「~int」は「int」を基底に持つ型を内包できる
~int | ~uint | string
}
func Smallest[T Orderd] (x, y T) T {
if x < y {
return x
}
return y
}
Genericsデモ
04. これからのGo
Constraint elements
Interfaceに制約を
持たせる文法が追
加された.