第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

級聯(lián)調用泛型函數(shù)時的泛型類型推斷

級聯(lián)調用泛型函數(shù)時的泛型類型推斷

Go
當年話下 2023-02-06 19:29:32
在構建(我的第一個)泛型重庫時,我遇到了泛型類型檢查實現(xiàn)的一些明顯限制——更可能是我缺乏知識。任何想法如何讓下面的東西工作?package mainimport (    "fmt"    "reflect")type Number interface {    int | float32}type MultiDimensionSlice interface {    int | float32 | []int | []float32 | [][]int | [][]float32}func dimensions[S MultiDimensionSlice](s S) int {    dims := 0    t := reflect.TypeOf(s)    for t.Kind() == reflect.Slice {        dims += 1        t = t.Elem()    }    return dims}func indirection[T Number](v T) int {    var slice2D [][]T    return dimensions(slice2D)}func main() {    x := [][]float32{{1}, {2}, {3}}    fmt.Printf("x=%v, dims=%d\n", x, dimensions(x))    fmt.Printf("indirection should return 2, got %d\n", indirection(0))}這無法與消息一起編譯[][]T does not implement MultiDimensionSlice ([][]T missing in int | float32 | []int | []float32 | [][]int | [][]float32)但在函數(shù)內,indirection()所有允許的值都T將在dimensions().任何幫助或指示將不勝感激!(游樂場鏈接)ps.: 我的問題比那復雜一點,但問題是一個泛型函數(shù)(indirection()在這個例子中)不能調用另一個(dimensions()這里)因為(顯然)Go 編譯器不能解析類型參數(shù)約束(信息在編譯時存在......)。
查看完整描述

1 回答

?
HUH函數(shù)

TA貢獻1836條經驗 獲得超4個贊

正如評論中提到的,go 在其泛型方面有一些限制。您可以通過解決方法實現(xiàn)所需的功能。


首先,您需要更改您定義的接口。(也讓它通用)


type Number interface {

    int | float32

}


type MultiDimensionSlice[T Number] interface {

    Number | []T | [][]T

}

然后我們需要更改dimension方法類型參數(shù)。dimensions如果 go 讓我們這樣定義方法,那會更清晰


func  dimensions[S Number](s MultiDimensionSlice[S]) int {

但我們所能做的就是:


func dimensions[S Number, K MultiDimensionSlice[S]](s K) int {

    dims := 0

    t := reflect.TypeOf(s)

    for t.Kind() == reflect.Slice {

        dims += 1

        t = t.Elem()

    }

    return dims

}

然后我們需要改變我們調用dimensions方法的方式。我們需要提供一個額外的類型參數(shù),以便可以推斷類型參數(shù)S


func indirection[T Number](v T) int {

    var slice2D [][]T

    return dimensions[T](slice2D)

}


func main() {

    x := [][]float32{{1}, {2}, {3}}

    fmt.Printf("x=%v, dims=%d\n", x, dimensions[float32](x))

    fmt.Printf("indirection should return 2, got %d\n", indirection(0))

}


查看完整回答
反對 回復 2023-02-06
  • 1 回答
  • 0 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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