首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将类型约束为带有索引的类型?

问如何将类型约束为带有索引的类型?
EN

Stack Overflow用户
提问于 2022-02-20 21:22:01
回答 1查看 402关注 0票数 0

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-20 22:20:24

您可以在联合中使用约束,但是您可以拥有的唯一有意义的是:

代码语言:javascript
复制
type Indexable interface {
    ~[]byte | ~string
}

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

仅此而已,暂时的。为什么?

  1. 对具有union约束的类型所允许的操作仅限于约束类型集中所有类型的操作。
  2. 若要允许索引,联合中的类型必须具有相等的键类型和相等的元素类型。
  3. 类型参数建议表明,map[int]T可以与[]T结合使用,但是这是不允许的。规范现在在索引表达式中提到了这一点:“如果在P的类型集中存在一个映射类型,则该类型集中的所有类型都必须是映射类型,并且相应的键类型必须都是相同的”。
  4. 对于数组,长度是类型的一部分,所以联合必须指定您想要处理的所有可能的长度,例如[1]T | [2]T等。非常不切实际,并且容易出现超出范围的问题(有一个提案来改进这个问题)。

因此,支持索引的唯一不同类型的联合似乎是[]byte | string (可能是近似的~)。因为byte是uint8的别名,所以也可以使用[]uint8实例化。

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

注意到,[]byte | string支持索引,但不支持range,因为这个联合没有核心类型。

操场:mrZ

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71198899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档