为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
aluckdog 2022-11-08 17:09:51
自 1.18 引入泛型以来,我决定深入研究 Go。我想实现一个只接受顺序类型的算法——数组、切片、映射、字符串,但我不知道如何破解。是否有一种可以针对涉及可索引性的方法?
查看完整描述

1 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

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


type Indexable interface {

    ~[]byte | ~string

}


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

    return v[i]

}

暂时就是这样。为什么?

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

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

  3. 类型参数提案建议map[int]T可以在与 的联合中使用[]T,但是这已被禁止。规范现在在索引表达式中提到了这一点:“如果 P 的类型集中存在映射类型,则该类型集中的所有类型都必须是映射类型,并且相应的键类型必须全部相同”

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

因此,唯一支持索引的具有多种类型的联合似乎是[]byte | string(可能近似~)。由于byte是 的别名uint8,您也可以使用 进行实例化[]uint8

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

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

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


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信