1.背景介绍:
 笔者最近发现对于Go的struct在使用==的时候,有时候可以使用,有时候却不能使用,甚至编译出错。基于这个既定事实,笔者做了一次实现,便整理了这篇文章出来。
struct使用==的例子如下所示:
场景1:==可以使用
package mainimport ("fmt")type node struct {Name stringAge int}func main() {n1 := node{Name: "hello", Age: 10}n2 := node{Name: "hello", Age: 10}if n1 == n2 {fmt.Println("n1==n2")}}
Output:
 n1==n2 场景2: ==使用不成功
package mainimport ("fmt")type node1 struct {Name stringAge *int}func main() {var a1, a2 int = 10, 10n3 := node1{Name: "hello", Age: &a1}n4 := node1{Name: "hello", Age: &a2}if n3 == n4 {fmt.Println("n3==n4")} else {fmt.Println("n3!=n4")}n4.Age = &a1if n3 == n4 {fmt.Println("n3==n4")} else {fmt.Println("n3!=n4")}}
Output:
n3!=n4n3==n4
执行结果分析:
通过场景1和场景2的输出结果来看,在struct内部是基本类型的时候,==是可以使用的,并且判断的结果也是正确的。然而,在struct内部含有指针的时候,就算指针里面的取值是相同的,==执行结果也认为是不同的,这与我们使用==的初衷并不相同,并且在指针指向同一个存储位置的时候,==执行的结果又是正确的。
(备注:这个其实是由于struct只是比较指针的地址是否相同来判定==是否一致的,并没有去比较指针指向地址中的数值是否相同,有点类似C++中的深copy和浅copy的情况)。
2. ==的详细使用场景总结:
1)基本类型的
对于基本类型,==判断都是没有问题的,Go支持的很好,例子如下:
package mainimport ("fmt")func main() {var a, b intfmt.Println(a == b)var a1, b1 float64fmt.Println(a1 == b1)var a2, b2 string = "hello", "hello"fmt.Println(a2 == b2)}
output:
truetruetrue
2) slice和数组的
package mainimport ("fmt")func main() {strs1 := []string{"hello"}strs2 := []string{"hello"}if strs1 == strs2 {fmt.Println("str1 == str2")}}
output: // 竟然都编译不过
 ./prog.go:10:11: invalid operation: strs1 == strs2 (slice can only be compared to nil) 数组的==操作
package mainimport ("fmt")func main() {strs1 := [2]string{"hello"}strs2 := [2]string{"hello"}if strs1 == strs2 {fmt.Println("str1 == str2")}}
output: // 数组就能成功使用==,原因是数组在Go中被认为是基本类型
 str1 == str2 3)对于指针,map,interface的使用
package mainimport ("fmt")func main() {var strs1,strs2 map[int]bool = make(map[int]bool),make(map[int]bool)if strs1 == strs2 {fmt.Println("str1 == str2")}}
output: // map的执行结果与slice一致
 ./prog.go:10:11: invalid operation: strs1 == strs2 (map can only be compared to nil) 对于指针,背景知识里面已经说过,比较的是指针的地址是不是相同,不会去比较指针指向内存中的数值。
对于接口的==比较,可以参考我的另外一篇文章:接口的nil != nil
原文:https://mp.weixin.qq.com/s/LVNtr0EuenbCZ9JN6Qx3fw
公众号:灰子学技术
有疑问加站长微信联系(非本文作者)
 