关于go的==

120 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

最近在学习go,发现go的等值比较还是有非常多值得注意的地方。这里做个简单的实验,并记录一下。如果有上面不对,或者说错的地方,可以在评论区指出

基本类型的比较

func main() {
   a := 1
   b := 1
   fmt.Println(a == b)
}

image.png

基本类型是直接比价具体值的大小的,但是这里有一个要注意的地方就是如果类型不同,无法比较,连编译都过不了,如下

image.png

结构体和结构体指针的比较

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)
}

image.png

由上面的实验可以得出结论,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里面,对于数组的比较也是比较数组的值。逐个元素比较,但是如果数组的长度不一样呢。

image.png

数组长度不同,不能比较,连编译都过不了

切片和map的比较

image.png

image.png

我们惊奇地发现,slice和map是无法比较的,事实上slice和map只能和nil进行比较。我上网搜了一番,发现好像没收获。有大佬就教教我吧

关于上面遇到的一些问题,事实上可以通过reflect.DeepEqual来经行比较。官网挺详细 反射包 - 反射 - pkg.go.dev