Golang中哪些不能作为map类型的key?

在 Go 语言中,map 的键可以是任何可以使用 ==!= 运算符进行比较的类型。这意味着以下类型可以作为 map 的键:

  • 基本类型:intfloatboolstring
  • 接口类型
  • 指针类型
  • 数组类型(数组中的元素必须是能作为键的类型)

然而,以下类型不能作为 map 的键:

  • slice
  • map
  • function
  • 包含上述类型的结构体

这是因为 slicemapfunction 等类型的值不是固定的(它们在内存中的表示可能会改变),因此不能用于比较。例如,两个包含相同元素的 slice 在使用 == 运算符进行比较时会产生编译错误,因此 slice 不能作为 map 的键。

这里举个例子说明:

// 基本类型可以作为键
m1 := make(map[int]string)

// 结构体可以作为键,前提是结构体的字段都可以作为键
type keyStruct struct {
    Key1 string
    Key2 int64
}
m2 := make(map[keyStruct]string)

// 下面这种情况会编译错误,因为 slice 不能作为键
m3 := make(map[[2]int]string) // 编译错误

在实际应用中,为了保证可比较性,最常用的 map 键类型是 intstring

发表评论

后才能评论