在判断是否相等之前,我们先看下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
作者:西伯尔
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。