亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將類型(int、float 等)轉換為 `T` [go1.18]

將類型(int、float 等)轉換為 `T` [go1.18]

Go
jeck貓 2022-10-17 17:06:43
場景:支持泛型的 Go 1.18問題:無法將數字轉換為泛型。說明:我正在嘗試移植我的general purpose庫以支持泛型。我正在處理數字轉換錯誤。我定義了一個包含所有數字類型的包,如下所示:package typestype 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
查看完整描述

2 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

您可以像往常一樣將值轉換為參數類型。

從提案類型轉換

在具有兩個類型參數From和的函數中,如果From 約束的類型集中的所有類型都可以轉換為 To 約束的類型集中的所有類型,則 type 的值可以轉換為 type 的值To。FromTo

在這種情況下,您實際上并沒有 aFrom因為它是切片索引int;目標類型將是T(即使這可能不是您想要的,請參閱下面的原因)。當然int可以轉換為T' 類型集,因為它僅包括數字類型(盡管在or 的情況下會截斷或丟失精度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


查看完整回答
反對 回復 2022-10-17
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

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

}


查看完整回答
反對 回復 2022-10-17
  • 2 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號