自 1.18 引入泛型以来,我决定深入研究 Go。我想实现一个只接受顺序类型的算法——数组、切片、映射、字符串,但我不知道如何破解。是否有一种可以针对涉及可索引性的方法?
1 回答
杨魅力
TA贡献1811条经验 获得超6个赞
您可以将约束与联合一起使用,但唯一有意义的约束是:
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
索引但不支持范围,因为这个联合没有核心类型。
游乐场:https ://gotipplay.golang.org/p/uatvtMo_mrZ
- 1 回答
- 0 关注
- 93 浏览
添加回答
举报
0/150
提交
取消