如何将类型限制为具有索引的类型?

How to constrain type to types with index?

自 1.18 引入泛型以来,我决定深入研究 Go。我想实现一个只接受顺序类型的算法——数组、切片、映射、字符串,但我无法破解如何。

是否有可以针对涉及可索引性的方法?

您可以将约束与并集一起使用,但是您可以拥有的唯一有意义的是:

type Indexable interface {
    ~[]byte | ~string
}

func GetAt[T Indexable](v T, i int) byte {
    return v[i]
}

暂时就这些。为什么?

  1. 具有联合约束的类型所允许的操作仅是约束类型集中所有类型所允许的操作。

  2. 要允许索引,联合中的类型必须具有相同的键类型和相同的元素类型。

  3. 类型参数提案建议 map[int]T 可以与 []T 联合使用,但是这已被禁止。现在的规范在Index expressions中提到了这一点:“如果P的类型集中有一个map类型,则该类型集中的所有类型都必须是map类型,并且各自的key类型必须是all完全相同".

  4. 对于数组,长度是类型的一部分,因此联合必须指定您要处理的所有可能长度,例如[1]T | [2]T 等。非常不切实际,并且容易出现 out-of-bounds 问题(有一个 proposal 可以改善这一点)。

所以唯一支持索引的不同类型的联合似乎是[]byte | string(可能近似于~)。由于byteuint8的别名,你也可以用[]uint8.

实例化

除此之外,没有其他方法可以定义支持对所有种可能的可索引类型进行索引的约束。

注意 []byte | string 支持索引 但不支持范围 ,因为这个联合 .

游乐场:https://gotipplay.golang.org/p/uatvtMo_mrZ