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不能进行比较
- 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)