自定义类型的映射键限制
某些类型本质上不适合作为映射键,例如映射、切片和函数。但是,一些开发人员可能希望显式阻止将特定的自定义类型用作映射键。
最初,依赖类型中的私有成员似乎是一种解决方案,但这种方法是无效的。为了解决这个问题,我们需要一个更根本的、符合语言规范的解决方案。
禁止使用类型作为映射键的关键在于违反比较运算符的要求。根据规范,映射键类型必须具有完全定义的比较运算符 == 和 !=。因此,通过包含不可比较类型的字段,我们可以有效地使整个类型不可比较。
例如,考虑以下类型:
type MyType struct { A *A b b notComparable []int }
添加字段notComparable 与切片类型呈现整个 MyType 不可比较,从而阻止其用作映射键。这是因为切片无法进行比较。
m := map[MyType]int{} // Compile-time error: invalid map key type MyType
值得注意的是,引入不可比较字段可能会产生进一步的影响。例如,它将无法使用 == 和 != 等运算符来比较类型的值。但是,通过仔细设计类型,可以保留特定字段的可比性,同时仍然防止该类型被用作映射键。
以上是如何防止自定义类型被用作 Go 中的映射键?的详细内容。更多信息请关注PHP中文网其他相关文章!