GO语言中结构体的(== 和 !=)比较
GO语言中结构体的比较
1. 同一个struct的两个实例能用 == 或 != 来进行比较吗
答案:可以能,也可以不能
如果结构体内的所有成员变量都是可以比较的,那么结构体就可以进行比较。
如果结构体中存在不可以比较的成员变量那么结构体就不能进行比较。
那么哪些数据类型是可以比较的呢?
1. 简单类型
2. 可排序的数据类型
1. 整型
2. 浮点型
3. 字符串
3. 其他可比较类型
Boolean
Complex
Pointer
Channel // 注意Channel 是可以进行比较的
Interface // 接口
Array
不可比较类型
Slice
Map
Function
可比较的结构体例子
package main
import "fmt"
type User struct {
a int
}
func main() {
a := User{a:1}
b := User{a:1}
c := User{a:2}
fmt.Println(a == b) // true
fmt.Println(b == c) // false
}
加入不可比较的复杂类型
type People struct {
name string
m map[int]int
weight int
}
func CantNotComparable() {
p1 := People{
name: "wang",
m: make(map[int]int),
weight: 0,
}
p2 := People{
name: "wang",
m: make(map[int]int),
weight: 0,
}
fmt.Println(p1 == p2) // 此时编译器会直接显示错误 无法编译通过
}
如果此时其改为指向结构体的指针,此时报错提示会取消,因为此时实际上相当于在比较两个指针类型的变量
func CantNotComparable() {
p1 := &People{
name: "wang",
m: make(map[int]int),
weight: 0,
}
p2 := &People{
name: "wang",
m: make(map[int]int),
weight: 0,
}
fmt.Println(&p1, &p2)
fmt.Println(p1 == p2)
}
2. 两个不同的struct的实例能不能比较 == !=
答案:可以能,也可以不能
如果想要比较两个不同的struct的实例的话,需要先进行结构类型的转换
转换成同一个结构类型才可以进行比较
结构体之间进行转换需要他们具备完全相同的成员(字段名、字段类型、字段个数)
func CantNotComparable() {
p1 := People{
name: "wang",
weight: 0,
}
p2 := User{
name: "wang",
weight: 1,
}
p3 := People(p2) // 进行结构体转换
fmt.Println(p1 == p3)
}