【Go自学】一文搞懂Go Comparable和Ordered类型

我们在学校Go语言的泛型时会经常使用 interface{} / any来替代所有的数据类型,除此之外我们还可以使用comparable 关键字来指代golang中所有可以用!=或者==来进行比较的元素。我们可以先查看comparable 的源码。

// comparable is an interface that is implemented by all comparable types
// (booleans, numbers, strings, pointers, channels, arrays of comparable types,
// structs whose fields are all comparable types).
// The comparable interface may only be used as a type parameter constraint,
// not as the type of a variable.
type comparable interface{ comparable }

这段话中定义了,布尔值、数字值、字符串、指针、通道、数组以及所有字段都相同的结构体属于comparable 类型。

comparable 比较容易引起误解的一点是很多人容易把他与可排序搞混淆。可比较指的是 可以执行 != == 操作的类型,并没确保这个类型可以执行大小比较( >,<,<=,>= )

  • Comparable:可以使用 == 和 != 比较,非黑即白
  • Ordered:可以使用 > >= < <= 做大小比较,有明确的大小概念

下面一个表格介绍了所有 Go 内置类型的约定

TypeComparableOrderedDescription
Boolean
Integer
Float
Complex分别比较实数和虚数,同时相等则两个复数相等。 如果需要比较大小,需要开发者分别比较实数和虚数。
String基于字节逐个比较。
Pointer如果两个指针指向同一个对象或者都为 nil,则两者相等。
Channel类似 Pointer,两个 Channel 变量只有都为 nil,或者指向同一个 Channel 的时候才相等。
Interface两个 interface 的 Type 和 Value 值同时相等时,两者才相等。
Struct⚠️仅当 Struct 内所有成员都是 Comparable,这个 Struct 才是 Comparable 的。 如果两个 struct 类型相同,且所有非空成员变量都相等,则两者相等。
Array⚠️仅当成员为 Comparable,Array 才是 Comparable 的。 如果两个 Array 中的每一个元素一一相等时,则两个 Array 相等。
Map
Slice
Func

从上面可以看到,Go 当中绝大多数类型都是可以使用运算符相互比较的,唯独不包含 Slice,Map 和 Func,也有容器类型 Struct、Array 本身的comparable 取决于成员的类型。

本文链接:https://my.lmcjl.com/post/5695.html

展开阅读全文

4 评论

留下您的评论.