>백엔드 개발 >Golang >유형 비교를 위한 Go Generics의 `comparable` 제약 조건과 `Ordered` 제약 조건의 차이점은 무엇입니까?

유형 비교를 위한 Go Generics의 `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 Generics의 비교 제약 조건과 순서 연산자

Go Generics에서 비교 제약 조건은 동등 연산자(== 및 !=), 순서가 지정된 연산자(<, >, <= 및 >=)에는 Ordered가 필요합니다. Constraint.

다음 코드를 고려하세요.

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의 오류는 비교가 순서 비교를 보장하지 않기 때문에 발생합니다. 여기에는 순서 지정을 지원하지 않는 맵 키 유형이 포함되어 있습니다.

Go 1.18~1.20용 솔루션

Go 1.21 이전에는 제약 조건을 사용하세요.주문됨:

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 Generics의 `comparable` 제약 조건과 `Ordered` 제약 조건의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.