// 型定義の例 type Vector[T any] []T type Map[K comparable, V any] map[K]V // 型パラメータは複数持てる type Pair[A, B any] struct { a A; b B } // 連続する型パラメータの制約が共通な時は省略も可能 // 関数宣言の例 func Min[T constraints.Ordered](a, b T) T { if a < b { return a } return b }
comparable](a, b T) bool { return a == b } func main() { fmt.Println(Equal(1, 2)) // OK: => false var a, b interface{} a = 1 b = 2 fmt.Println(Equal(a, b)) // NG: interface{} does not implement comparable }
。 Ordered は、 < <= >= > 記号で順序付け可能な型に対する制約。 // スライド冒頭の Min 関数の例 import "golang.org/x/exp/constraints" func Min[T constraints.Ordered](a, b T) bool { if a < b { return a } return b }
以降に持ち越し type Vector[T any] []T type IntVector = Vector[int] // OK ( 型エイリアス宣言は型パラメータを持っていない) type Map[K comparable, V any] map[K]V type StringMap[V any] = Map[string]V // NG (Go 1.18 時点では書けないが、将来的には書けるようになる見込み)