1 回答

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))
}
- 1 回答
- 0 關注
- 114 瀏覽
添加回答
舉報