持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
最近在学习go,发现go的等值比较还是有非常多值得注意的地方。这里做个简单的实验,并记录一下。如果有上面不对,或者说错的地方,可以在评论区指出
基本类型的比较
func main() {
a := 1
b := 1
fmt.Println(a == b)
}
基本类型是直接比价具体值的大小的,但是这里有一个要注意的地方就是如果类型不同,无法比较,连编译都过不了,如下
结构体和结构体指针的比较
package main
import (
"fmt"
)
type User struct {
Name string
Age int
}
func main() {
u1 := User{Name:"fzw",Age:2}
u2 := User{Name:"fzw",Age:2}
_u1 := &u1
_u2 := &u2
fmt.Println(u1 == u2)
fmt.Println(_u1 == _u2)
}
由上面的实验可以得出结论,go等号两边结构体的比较,会比较结构体内,每一个属性的值。如果是结构体指针的话,就是比较指针的值是否相等。
数组的比较
package main
import (
"fmt"
)
func main() {
u1 := [...]int{1,2,3,4,5}
u2 := [...]int{1,2,3,4,5}
fmt.Println(u1 == u2)
}
在go里面,对于数组的比较也是比较数组的值。逐个元素比较,但是如果数组的长度不一样呢。
数组长度不同,不能比较,连编译都过不了
切片和map的比较
我们惊奇地发现,slice和map是无法比较的,事实上slice和map只能和nil进行比较。我上网搜了一番,发现好像没收获。有大佬就教教我吧
关于上面遇到的一些问题,事实上可以通过reflect.DeepEqual来经行比较。官网挺详细 反射包 - 反射 - pkg.go.dev