ホームページ >バックエンド開発 >Golang >Go ジェネリックスの型比較における「comparable」制約と「Ordered」制約の違いは何ですか?

Go ジェネリックスの型比較における「comparable」制約と「Ordered」制約の違いは何ですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-10 14:36:11710ブラウズ

What's the Difference Between `comparable` and `Ordered` Constraints in Go Generics for Type Comparisons?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。