Rumah > pembangunan bahagian belakang > Golang > Apakah Perbezaan Antara Kekangan `sebanding` dan `Tertib` dalam Go Generik untuk Perbandingan Jenis?

Apakah Perbezaan Antara Kekangan `sebanding` dan `Tertib` dalam Go Generik untuk Perbandingan Jenis?

Barbara Streisand
Lepaskan: 2024-12-10 14:36:11
asal
764 orang telah melayarinya

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

Kekangan Setanding lwn. Operator Dipesan dalam Go Generics

Dalam Go generik, kekangan setanding mengehadkan jenis yang menyokong pengendali kesaksamaan (== dan !=), manakala pengendali yang dipesan (<, >, <=, dan >=) memerlukan kekangan Tertib.

Pertimbangkan kod berikut:

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))
}
Salin selepas log masuk

Ralat dalam getBiggerNumberWithComparable timbul kerana setanding tidak menjamin perbandingan pesanan. Ia termasuk jenis kunci peta yang tidak menyokong pesanan.

Penyelesaian untuk Go 1.18 hingga 1.20

Sebelum Pergi 1.21, gunakan kekangan. Dipesan:

import (
    "fmt"
    "golang.org/x/exp/constraints"
)

func getBiggerNumberWithOrdered[T constraints.Ordered](t1, t2 T) T {
    if t1 > t2 {
        return t1
    }
    return t2
}
Salin selepas log masuk

Penyelesaian untuk Go 1.21

Dalam Go 1.21 dan lebih baru, gunakan cmp.Diperintahkan:

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
}
Salin selepas log masuk

Atas ialah kandungan terperinci Apakah Perbezaan Antara Kekangan `sebanding` dan `Tertib` dalam Go Generik untuk Perbandingan Jenis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan