在判断是否相等之前,我们先看下go中的类型都有哪些吧,不同类型比较方式不同

1、可用 == 和 != 直接比较的类型

bool布尔类型;
数值类型:两个值具有相同的数值类型或者可以转化为相同的类型;
string字符串;
指针:比较两个指针是否指向内存中的同一个值,或者都为 nil;
channel:比较两个channel是否来自同一个 make 的调用,或者都为 nil。

此外,如果 struct 和 数组是由这些可比较类型组成的,那么它们也可以进行比较相等性。
但是,map 和 slice 无法通过 == 和 != 比较相等性。

// bool, 

// 数值型:int

// string, 指针, channel
a == b
// 由以上几种类型组成的 struct 和 数组

2、派生类型比较

(a) 指针类型(Pointer)【可用和!=】
(b) 数组类型
(c) 结构化类型(struct)
(d) channel 类型【可用
和!=】
(e) 函数类型
(f) 切片类型(slice)
(g) 接口类型(interface)
(h) map 类型

---下面未整理完---

2、[]byte(slice类型)

bytes.Equal(a,b)

3、[]xx(非byte类型的两个slice)
非byte类型的slice,即[]xx,我们还可以借助reflect.DeepEqual,用于深度比较两个对象包括它们内部包含的元素是否都相等:
func DeepEqual(x, y interface{}) bool

a := []byte{1, 2, 3}
b := []byte{0, 1, 3, 2}
reflect.DeepEqual(a, b)

但是,reflect的代价要大得多,非必要别用DeepEqual!

参考:
https://www.cnblogs.com/apocelipes/p/11116725.html
https://www.bilibili.com/read/cv11994623

posted on 2022-02-17 17:42  西伯尔  阅读(852)  评论(0编辑  收藏  举报