首页  >  文章  >  后端开发  >  你能阻止一个类型在 Go 中被用作 Map Key 吗?

你能阻止一个类型在 Go 中被用作 Map Key 吗?

Linda Hamilton
Linda Hamilton原创
2024-10-27 09:06:30966浏览

 Can You Prevent a Type from Being Used as a Map Key in Go?

防止类型用作映射键

虽然拥有可用作映射键的类型通常是有益的,但在某些情况下,可能有必要限制其使用。虽然假设类型中存在私有成员会阻止其在定义包之外用作映射键是一种常见的误解,但实际上,它并不提供此类保护。

防止映射键使用的最佳方法

防止类型被用作映射键的最有效方法是违反映射类型规范,该规范要求键类型必须启用以下定义:比较运算符(== 和 != )。通过在类型被认为不可比较的类型(例如切片或函数)中合并字段,您可以有效地禁止将其用作映射键。

考虑以下示例:

type MyType struct {
    S             string
    i             int
    notComparable []int
}

尝试使用 MyType 作为映射键:

m := map[MyType]int{}

将导致编译时错误:

invalid map key type MyType

阻止映射键使用的后果

需要注意的是,通过采取这种措施,您将丧失使用比较运算符来比较您的类型的值的能力。例如,以下代码将不再起作用:

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
}

通过这种方法,myType 保持可比性,而导出的包装类型 MyType 不能用作映射键。

以上是你能阻止一个类型在 Go 中被用作 Map Key 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn