在构建(我的第一个)泛型重库时,我遇到了泛型类型检查实现的一些明显限制——更可能是我缺乏知识。
任何想法如何让下面的东西工作?
package main
import (
"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)
但在函数内,indirection()所有允许的值都T将在dimensions().
任何帮助或指示将不胜感激!
(游乐场链接)
ps.: 我的问题比那复杂一点,但问题是一个泛型函数(indirection()在这个例子中)不能调用另一个(dimensions()这里)因为(显然)Go 编译器不能解析类型参数约束(信息在编译时存在......)。
HUH函数
相关分类