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)