翔云

Just try, don't shy. 最新文章请点击
随笔 - 294, 文章 - 0, 评论 - 27, 阅读 - 49万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

golang 哪些类型可以作为map key

Posted on   翔云123456  阅读(661)  评论(0编辑  收藏  举报

在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

参考

Comparison operators

Go maps in action

golang interface判断为空nil

Go 的类型断言type assertion

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示