Map中可以作为Key的类型

本文介绍了Go语言中Map的关键特性,强调了Key必须是可比较的类型,如整型、浮点型、字符串等。不可比较的类型如slice、map、function不能作为Key。文中还探讨了接口、指针、结构体和通道类型的比较规则,并举例说明。理解这些规则对于编写Go代码至关重要。
摘要由CSDN通过智能技术生成

Map中可以作为Key的类型

1. golang中能够用 == 号直接比较的数据类型有如下

整型 int、浮点型 float、字符串 string、布尔型 bool、复数型 complex、指针型 pointer、通道型 channel、接口型 interface、数组型 array

2. 不能直接比较的

切片型 slice、键值对型 map、函数型 func

golang中map的key必须是可以比较的,要使key值不一样就需要进行比较,因此,map中的key是可以使用==进行比较的。

slice,map,funcation不能进行比较

  1. slice:
  • 引用类型:比较地址没有意义
    为什么是引用类型?
    可以值传递进行判断,发现可以更改数据,证明slice本身就是引用类型
    不是引用类型的话,在被调用函数里修改参数值时,实参并不会发生变化,参数值的变化只做用在拷贝上(go中所有参数的传递都是值拷贝,引用类型拷贝地址)
func slice(a []int) {
	a[0] = 10
}
func main() {
	a := []int{1, 2, 3, 5}
	slice(a)
	fmt.Printf("%v", a)
}
//[10 2 3 5]

  • 切片有len , cap 比较不好衡量,因此go设计的时候就不允许切片可比较。

map , funcation比较也是直接报错,不可比,只能与nil比较

interface 是如何比较的

interface比较是相等的

//第一种
func main() {
	var a interface{}
	var b interface{}
	fmt.Println(a == b)
}//true

//第二种
import "fmt"

type a interface {
	
}
type b interface {

}
func main() {
	var c a
	var d b
	fmt.Println(c == d)
}//true

赋值接口比较:
类型不同、值不同的情况下为 false。只有类型和值均相等的情况下,两个interface 的实例才相等
带有方法的interface:
如果两个interface 的 方法相同,那么结果为 true
如果方法不同,为false

import "fmt"

type a interface {
	bb() int
}

type b interface {
	bb() int
}

func main() {
	var c a
	var d b

	fmt.Println(c == d)
}//true

注意特殊: 如果一个含有方法的interface 实例 和一个 空的interface 实例 比较,并且空实例 未 赋值,那么两者相等。但是,如果对空的interface 实例赋值,那么不相等

指针类型比较

 var num1, num2 int
	num1 = 8
	num2 = 8

	pt1 := &num1
	pt2 := &num1
	pt3 := &num2
    
    //定义一个空指针
	var pt4 *int

    //只有指向同一个变量,两个指针才相等
    //输出:true false
	fmt.Printf("%v %v\n", pt1 == pt2, pt1 == pt3)
    
    //指针可以与nil直接比较
    //输出:true false
	fmt.Printf("%v %v\n", pt4 == nil, pt1 == nil)//true false

结构体比较

如果struct的所有成员都可以进行比较,则该struct就可以通过==或者!=进行比较是否相等,比较是逐一进行比较,每一项相等才相等
详细请看

struct里面的类型必须是可比较的,才能作为map中的key,不然会报错

通道类型比较

如果两个通道是由同一个make创建的,或者两个通道值都为nil,那么它们是相等的。


ch1 := make(chan int)
	ch2 := make(chan int)

	var ch3 chan int
	ch3 = ch1

	var ch4 chan int
	var ch5 chan int
    var ch6 chan string
    
    //同一个make创建的通道才相等
    //输出:false true
	fmt.Printf("%v %v\n", ch1 == ch2, ch3 == ch1)
    
    //通道值可与nil比较
    //输出:true true
	fmt.Printf("%v %v\n", ch4 == ch5, ch5 == ch1)
	
	//两个不同类型的通道,即使都是空值,也不能比较
	//invalid operation: ch5 == ch6 (mismatched types chan int and chan string)
	fmt.Printf("%v\n", ch5 == ch6)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值