場景:
支持泛型的 Go 1.18
問題:
無法將數字轉換為泛型。
說明:
我正在嘗試移植我的general purpose庫以支持泛型。我正在處理數字轉換錯誤。
我定義了一個包含所有數字型別的包,如下所示:
package types
type Number interface {
int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | uintptr | float32 | float64
}
我沒有處理泛型的特別問題。我唯一不明白的是:
如何將定義的型別(如int)轉換為泛型?
讓我們假設以下示例:
// FindIndexValue is delegated to retrieve the index of the given value into the input array.
func FindIndexValue[T types.Number](array []T, value T) []T {
var indexs []T
for i := range array {
if array[i] == value {
indexs = append(indexs, i)
}
}
return indexs
}
在上面的代碼段中,錯誤位于以下行中:
...
for i := range array {
...
}
這是因為range內置函式迭代陣列并回傳int給定位置的索引 ( )。
問題是:
如何將定義的型別(int在本例中)轉換為泛型T?
錯誤:
cannot use i (variable of type int) as type T in argument to append
uj5u.com熱心網友回復:
int無論切片的元素型別如何,索引始終為整數型別 ( )。所以結果型別應該是[]int.
你為什么想要它[]T?如果T是uint8并且傳遞的切片包含超過 256 個元素,則您甚至無法回傳正確的索引。
func FindIndexValue[T types.Number](array []T, value T) []int {
var indices []int
for i, v := range array {
if v == value {
indices = append(indices, i)
}
}
return indices
}
uj5u.com熱心網友回復:
您可以像往常一樣將值轉換為引數型別。
從提案型別轉換:
在具有兩個型別引數的函式
From和To,型別的值From可以被轉換成型別的值To,如果在型別組來自的約束所有型別可以在型別設定為的約束被轉換為所有型別。
在這種情況下,您實際上沒有 aFrom因為它是切片索引int;目標型別將是T(即使這可能不是您想要的,請參閱下面的原因)。當然int可以被轉換成T的組型別,由于它僅包括數值型別(盡管截斷或精度的損失在的情況下,int8或float64!)
indexs = append(indexs, T(i))
但是您的程式將索引切片宣告為[]T,這意味著將您的通用函式實體化為:
is := FindIndexValue([]float64{1,5,7,9}, float64(9))
將產生型別的結果[]float64。由于回傳的值是切片索引,它們總是int,這沒有多大意義。
最好是簡單地回傳[]int:
func FindIndexValue[T Number](array []T, value T) []int {
var indices []int
for i := range array {
// match on the generically typed slice item
if array[i] == value {
// store slice indices as ints
indices = append(indexs, i)
}
}
return indices
}
游樂場:https : //gotipplay.golang.org/p/EykXppG2qJa
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/376627.html
