Go 泛型:Map Key 的类型约束
在 Go1.18 中,定义一个可以用作 Map Key 的泛型链表失败并出现错误“Cons[int] 未实现可比较”。这是因为对映射键实现类似接口的严格要求,确保它们支持相等检查(== 和 !=)而不会出现恐慌。
Go 1.20 更新
在 Go 1.20 中,可比约束现在被认为是映射键的正确包罗万象。根据 Go 规范被认为可比较的类型,即使比较可能会出现恐慌,也将满足约束。这解决了根据规范可比较的类型与严格可比较的类型之间的不一致问题。
Go 1.18 和 1.19 注意事项
在 Go 1.18 和 1.19 中,可比较约束只能通过支持 == 和 != 的严格可比较类型来实例化,而不会出现恐慌。这排除了接口。尽管支持相等运算符,但接口并未实现可比较,因为它们的动态类型和值进行了比较。这意味着提供的 Cons 结构体(包含 List[X] 类型的字段)无法实现可比较。
替代约束
要解决此限制,嵌入可比较的自定义约束可以通过映射键结构来定义和实现,而不是使用接口字段。例如:
type List interface { comparable isList() bool }
总之,可比较约束现在是 Go 1.20 中推荐的映射键类型约束。在 Go 1.18 和 1.19 中,由于其无限的类型集,接口无法使用相当的实例化。嵌入可比较的自定义约束可以用作替代方案。
以上是Go 的映射键类型约束在 1.18、1.19 和 1.20 版本中如何演变?的详细内容。更多信息请关注PHP中文网其他相关文章!