golang 哪些类型可以作为map key

golang 哪些类型可以作为map key,第1张

golang 中,我们已经熟知的可以作为map key 的类型有 string, int。

那还有哪些类型可以作为key,哪些类型不可以呢?

本文对此做下简单介绍。

在golang规范中,可比较的类型都可以作为map key,包括:

类型说明
boolean 布尔值
numeric 数字包括整型、浮点型,以及复数
string 字符串
pointer 指针两个指针类型相等,表示两指针指向同一个变量或者同为nil
channel 通道两个通道类型相等,表示两个通道是被相同的make调用创建的或者同为nil
interface 接口两个接口类型相等,表示两个接口类型 的动态类型 和 动态值都相等 或者 两接口类型 同为 nil
structs、arrays只包含以上类型元素

不能作为map key 的类型包括:

slicesmapsfunctions

下面针对几种类型的比较做举例说明。

代码如下


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
参考

Comparison operators

Go maps in action

golang interface判断为空nil

Go 的类型断言type assertion

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/989820.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存