MST

星途 面试题库

面试题:Go语言中map的键类型有什么限制

在Go语言的map集合类型中,说明键类型的限制条件有哪些,并举例说明为什么某些类型不能作为键。
20.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

键类型限制条件

  1. 可比较性:Go语言中,map的键类型必须是可比较的类型。即该类型必须支持 ==!= 操作符。这是因为map内部需要通过比较键来确定元素的位置和查找元素。
  2. 不可变:键类型的值在作为map键使用期间不能改变。虽然Go语言并没有严格意义上不可变类型的概念,但从实际使用角度,可比较的类型往往是不可变的,例如基本类型(整数、浮点数、字符串),指针,具名结构体等。

举例说明某些类型不能作为键

  1. 切片类型:切片类型不能作为map的键,因为切片是不可比较的。虽然从逻辑上看可以比较两个切片的内容是否相同,但Go语言中并没有为切片定义 ==!= 操作符。例如:
package main

func main() {
    // 以下代码会编译错误
    // var m map[[]int]int
    // m = make(map[[]int]int)
}
  1. map类型:map类型本身也是不可比较的,因此不能作为map的键。原因同切片,没有为map定义 ==!= 操作符。例如:
package main

func main() {
    // 以下代码会编译错误
    // var m map[map[string]int]int
    // m = make(map[map[string]int]int)
}
  1. 函数类型:函数类型同样不可比较,不能作为map的键。例如:
package main

func main() {
    // 以下代码会编译错误
    // var m map[func() int]int
    // m = make(map[func() int]int)
}

可作为键的类型示例:

package main

import "fmt"

func main() {
    m := make(map[string]int)
    m["key1"] = 100
    fmt.Println(m["key1"])

    type Point struct {
        x int
        y int
    }
    m2 := make(map[Point]int)
    p := Point{1, 2}
    m2[p] = 200
    fmt.Println(m2[p])
}

在上述示例中,字符串和具名结构体 Point 都可作为map的键,因为它们都是可比较的。