比较Go值

按类型比较

基本数据类型始终可以与==!=运营商:整数价值观,浮点数字,复杂的数字,布尔值价值观,细绳价值观,持续的价值观。

大批如果值包含可比较的元素类型,则它们是可比较的

指针值是可比较的。

渠道值是可比较的。

界面值是可比较的。

比较中界面值仅在动态类型可比较时才有效。

功能价值观,价值观和地图值是不是可比性,它们只能与nil,作为特殊情况。

比较规则

从Go规范:

  • 布尔型值是可比较的。如果两个布尔值都相等,则它们相等true或两者false

  • 整数值是可比较的,并且以通常的方式排序。

  • 浮点值具有可比性和有序性,如IEEE-754标准。

  • 复杂的值是可比较的。如果两个复数值u和v相等real(u) == real(v)andimag(u)== imag(v)`。

  • 细绳值是可比较的,并且按词法按字节顺序排序。

  • 指针值是可比较的。如果两个指针值指向同一个变量或两个都具有值,则它们相等nil。指向不同零大小变量的指针可以相等或可以不相等。

  • 渠道值是可比较的。如果两个通道值是由相同的make调用创建的,或者两个通道都有值,则它们是相等的nil

  • 界面值是可比较的。如果两个接口值具有相同的动态类型和相等的动态值,或者两个接口值都具有值,则它们是相等的nil

  • 的x值非接口类型X和一个值t界面类型T类型值可比X是可比的X贯彻T。他们相等,如果t的动态类型与X并且t的动态值等于x

  • 结构如果它们的所有字段都是可比较的,则值是可比较的。如果两个结构值对应的非空白字段相等,则它们相等。

  • 大批如果数组元素类型的值是可比较的,则这些值是可比较的。如果两个数组的对应元素相等,则它们相等。

比较失败

如果该结构包含一个类型不可比的字段,则比较时会出现编译时错误。

比较不可比类型:输入refect.DeepEqual()

reflectstdlib软件包提供了reflect.DeepEqual()该函数接受两种类型,并返回一个布尔值:

func DeepEqual(x, y interface{}) bool

不同类型的值永远不会完全相等,因此,如果您传递2种不同类型,则总会得到false

大批当它们的对应元素深相等时,值深深相等。

结构如果它们对应的字段深相等,则值是深相等的。

功能如果两个值都相等,则值是完全相等的nil;否则,它们就不会完全平等。

界面如果它们具有非常相等的具体价值,那么它们的价值就非常相等。

地图满足以下所有条件时,值将完全相等:-它们都是nil或两者皆非nil-它们具有相同的长度-它们是相同的地图对象或其对应的键(使用Go相等进行匹配)映射为深度相等的值。

指针如果使用Go's值相等,则值是非常相等的==运算符,或者它们是否指向非常相等的值。

满足以下所有条件时,值将完全相等:-它们都是nil或两者皆非nil-它们具有相同的长度,-它们指向同一基础数组的相同初始条目(即,&x[0] == &y[0])或它们对应的元素(最大长度)非常相等。

一个非零的空切片和一个nil切片(例如,[]byte{}[]byte(nil))并不完全相等。

其他值-数字布尔弦乐, 和频道-如果使用Go的==运算符相等,则深度相等。

一些不可避免的“特殊”案例值得列举:值可能与自身不相等:-因为它是func类型-因为它是一个浮点数NaN价值-因为它是一个大批结构, 或者界面包含这样的值

指针值始终指向自己,即使它们指向或包含此类有问题的值也是如此,因为它们使用Go's进行比较就等于==运算符,并且无论内容如何,都足以成为深度相等的条件。

同样适用于切片地图: 如果xy是相同的切片或相同的地图,无论内容如何,它们都是完全相等的。


更多教程: