Go ジェネリックにおける比較可能な制約と順序付き演算子
Go ジェネリックでは、比較可能な制約は等価演算子 (== および!=)、順序付き演算子 (<、>、<=、および>=) Ordered 制約が必要です。
次のコードを考えてみましょう:
import "fmt" type numbers interface { int | int8 | int16 | int32 | int64 | float32 | float64 } func getBiggerNumber[T numbers](t1, t2 T) T { if t1 > t2 { return t1 } return t2 } func getBiggerNumberWithComparable[T comparable](t1, t2 T) T { if t1 > t2 { // Compile error return t1 } return t2 } func main() { fmt.Println(getBiggerNumber(2.5, -4.0)) fmt.Println(getBiggerNumberWithComparable(2.5, -4.0)) }
getBiggerNumberWithComparable でエラーが発生するのは、comparable が順序の比較を保証していないためです。これには、順序付けをサポートしないマップ キー タイプが含まれます。
Go 1.18 から 1.20 へのソリューション
Go 1.21 より前では、制約を使用します。Ordered:
import ( "fmt" "golang.org/x/exp/constraints" ) func getBiggerNumberWithOrdered[T constraints.Ordered](t1, t2 T) T { if t1 > t2 { return t1 } return t2 }
Go のソリューション1.21
Go 1.21 以降では、cmp.Ordered:
import ( "fmt" "golang.org/x/exp/constraints" "github.com/google/go-cmp/cmp" ) func getBiggerNumberWithOrdered[T cmp.Ordered](t1, t2 T) T { if cmp.Less(t1, t2) { return t2 } return t1 }を使用します。
以上がGo ジェネリックスの型比較における「comparable」制約と「Ordered」制約の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。