自从1.18引入了泛型之后,我决定深入研究Go。我想实现一个只接受顺序类型的算法--数组、切片、映射、字符串,但我无法破解。
是否有一种方法可以针对涉及索引性?
发布于 2022-02-20 22:20:24
您可以在联合中使用约束,但是您可以拥有的唯一有意义的是:
type Indexable interface {
~[]byte | ~string
}
func GetAt[T Indexable](v T, i int) byte {
return v[i]
}仅此而已,暂时的。为什么?
map[int]T可以与[]T结合使用,但是这是不允许的。规范现在在索引表达式中提到了这一点:“如果在P的类型集中存在一个映射类型,则该类型集中的所有类型都必须是映射类型,并且相应的键类型必须都是相同的”。[1]T | [2]T等。非常不切实际,并且容易出现超出范围的问题(有一个提案来改进这个问题)。因此,支持索引的唯一不同类型的联合似乎是[]byte | string (可能是近似的~)。因为byte是uint8的别名,所以也可以使用[]uint8实例化。
除此之外,没有其他方法可以定义支持对所有可能的可索引类型进行索引的约束。
注意到,[]byte | string支持索引,但不支持range,因为这个联合没有核心类型。
操场:mrZ
https://stackoverflow.com/questions/71198899
复制相似问题