我没有看到禁止将类型用作键的任何好处。它只是一个可能使用也可能不使用的选项,类型不会因为您禁止将其用作地图键而变得更好、更小或更快。
但如果你想这样做:规格: 地图类型:
The 比较运算符== 和 != 必须为键类型的操作数完全定义;因此键类型不能是函数、映射或切片。
因此,如果您违反了比较运算符,你隐含地得到了你想要的。你有一个struct
,术语为struct
types:
如果结构体的所有字段都可比较,则结构体值也可比较。如果两个结构体值对应的非blank字段是相等的。
So struct
仅当所有字段都可比较时,值才可比较(因此只能用作映射中的键)。只需添加一个类型不可比较的字段即可。
切片、贴图和函数值不具有可比性。
例如,添加一个类型为切片的字段,然后就完成了:
type MyType struct {
S string
i int
notComparable []int
}
尝试使用上面的MyType
作为关键:
m := map[MyType]int{}
你会得到一个编译时错误:
invalid map key type MyType
Note:
我写过禁止类型作为密钥没有任何好处。不仅如此:从现在开始,您将无法再对您的类型的值使用比较运算符(因为存在额外的不可比较字段),因此例如您将失去比较这些值的选项:
p1, p2 := MyType{}, MyType{}
fmt.Println(p1 == p2)
编译时错误:
invalid operation: p1 == p2 (struct containing []int cannot be compared)
请注意,通过一些小技巧,您仍然可以保留类型的可比较性质,例如不导出您的类型,而是导出嵌入原始类型的包装类型;并将额外的、不可比较的类型添加到包装类型中,例如:
type myType struct {
S string
i int
}
type MyType struct {
myType
notComparable []int
}
func main() {
p1, p2 := MyType{}, MyType{}
fmt.Println(p1.myType == p2.myType)
}
这样你的myType
可以保持可比性,但仍然阻止导出、包装MyType
用作键类型的类型。