在golang 中,我们已经熟知的可以作为map key 的类型有 string, int。
那还有哪些类型可以作为key,哪些类型不可以呢?
本文对此做下简单介绍。
在golang规范中,可比较的类型都可以作为map key,包括:
类型 | 说明 |
---|---|
boolean 布尔值 | |
numeric 数字 | 包括整型、浮点型,以及复数 |
string 字符串 | |
pointer 指针 | 两个指针类型相等,表示两指针指向同一个变量或者同为nil |
channel 通道 | 两个通道类型相等,表示两个通道是被相同的make调用创建的或者同为nil |
interface 接口 | 两个接口类型相等,表示两个接口类型 的动态类型 和 动态值都相等 或者 两接口类型 同为 nil |
structs、arrays | 只包含以上类型元素 |
不能作为map key 的类型包括:
- slices
- maps
- functions
下面针对几种类型的比较做举例说明。
代码如下
package main
import (
"fmt"
)
type Orange struct {
Host string
Port int
}
func main() {
// 指针
orange1 := Orange{}
orange2 := Orange{}
op11 := &orange1
op12 := &orange1
op2 := &orange2
fmt.Println("op11 == op12 :", op11 == op12) // true
fmt.Println("op11 == op2 :", op11 == op2) // false
// 通道
ch1 := make(chan int, 1)
ch2 := ch1
ch3 := make(chan int, 1)
fmt.Println("ch1 == ch2 :", ch1 == ch2) // true
fmt.Println("ch1 == ch3 :", ch1 == ch3) // false
// 结构体
orange3 := Orange{}
orange4 := Orange{}
orange5 := Orange{"host001", 22}
fmt.Println("orange3 == orange4 :", orange3 == orange4) // true
fmt.Println("orange3 == orange5 :", orange3 == orange5) // false
// 数组
a1 := [1]int{0}
a2 := [1]int{0}
fmt.Println("a1 == a2 :", a1 == a2) // true
}
output:
op11 == op12 : true
op11 == op2 : false
ch1 == ch2 : true
ch1 == ch3 : false
orange3 == orange4 : true
orange3 == orange5 : false
a1 == a2 : true
参考
Just try, don't shy.