我正在探索 go generics(1.18 beta),并且有與比較兩個數值相關的問題(一個簡單的方法,需要兩個值并回傳一個更大的數字)。
為此,我正在創建一個涵蓋此型別集的自定義數字型別(在函式中getBiggerNumber):
int | int8 | int16 | int32 | int64 | float32 | float64
但是,又添加了一個函式,但這次沒有使用自定義型別,而是使用了comparable內置約束(在函式中getBiggerNumberWithComparable)。
但是下面的代碼給出了這個方法的錯誤,因為
“無效操作:無法比較 t1 > t2(操作員 > 未在 T 上定義)”?
知道為什么該>操作不適用于內置的可比較型別嗎?
package main
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 { // ./generics-sample.go:17:5: invalid operation: cannot compare t1 > t2 (operator > not defined on T)
return t1
}
return t2
}
func main() {
fmt.Println(getBiggerNumber(2.5, -4.0))
fmt.Println(getBiggerNumberWithComparable(2.5, -4.0))
}
uj5u.com熱心網友回復:
comparable是支持相等運算子==和的型別的約束!=。泛型提案在Comparable types in constraints 中定義了這一點:
為此,我們引入了一個新的預先宣告的型別約束:
comparable. 可比較約束的型別集是所有可比較型別的集合。這允許使用的==,并!=與該型別引數的值。
值得注意的是,這包括任何可以用作映射鍵的東西,包括陣列、具有可比較欄位的結構和將可比較值裝箱的介面。
確實,在 Go 語言規范中,比較運算子包括順序運算子,如 ( <, >, <=, >=)。這種術語的選擇可能會讓您感到困惑。然而,規格也消除了歧義:
相等運算子
==和!=適用于可比較的運算元。排序運算子<、<=、>和>=適用于已排序的運算元。
根據目前的尖端,標準庫約束支撐順序運算子,例如>與<是constraints.Ordered,定義為:
type Ordered interface {
Integer | Float | ~string
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405264.html
標籤:
下一篇:使用泛型從串列中選擇最大值
