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)) }
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 }
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 }
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!