检查接口的相等性

Posted

技术标签:

【中文标题】检查接口的相等性【英文标题】:Checking equality of interface 【发布时间】:2016-03-18 16:31:01 【问题描述】:

我正在为给定的interface 值搜索[]interface 切片:

var v interface
for i := 0; i < len(A); i++ 
  if (A[i] == v) 
    fmt.Println("Gotcha!")
    break
  

在普通情况下,类型是int。但是,例如,如果类型是一些自定义 struct,我该怎么办?

【问题讨论】:

如果结构是comparable,那么代码将照常工作。 对此进行扩展,引用@CodingPickle 的链接文档:Interface values are comparable. Two interface values are equal if they have identical dynamic types and equal dynamic values or if both have value nil. 相关:Is it possible to compare two interface values in Go? 【参考方案1】:

感谢@CodingPickle 评论,我从Go Programming Language Specification 提供以下内容

等式运算符 == 和 != 适用于可比较的操作数。

关于interfaces 和structs

接口值具有可比性。如果两个接口值具有相同的动态类型和相同的动态值,或者两者的值都为 nil,则它们是相等的。 当类型 X 的值可比较且 X 实现 T 时,非接口类型 X 的值 x 和接口类型 T 的值 t 是可比较的。如果 t 的动态类型与 X 相同且 t 的动态值是等于 x。 如果结构值的所有字段都是可比较的,那么它们的值是可比较的。如果对应的非空白字段相等,则两个结构值相等。

你也可以试试这个游乐场https://play.golang.org/p/bgO1_V87v9k

换句话说,在 Go 中处理相等似乎很容易!

【讨论】:

【参考方案2】:

更新:由于编写了上述问题和答案,Go 语言略有变化。

以前,如果比较两个接口并且其中一个或两个都包含不可比较的类型,则运行时会出现恐慌。现在,只有当它们都包含 same 不可比较的类型时,运行时才会恐慌。 (如果它们包含不同的类型,那么即使其中一种类型不可比较,结果现在也是错误的。)

什么是不可比较的类型?基本上,它们是切片、映射、函数以及使用它们的任何结构或数组类型。

AFAIK 这是围绕 Go 1.9 或 1.10 进行的无声更改。

【讨论】:

【参考方案3】:

我对 Go 类型的属性有一个总结

解释

depends - 仅当包含的类型具有可比性时才允许。)对于 Interface 类型,代码将编译,但如果在运行时包含的类型不可比较,则运行时将恐慌。感谢@Andrew W. Phillips。

【讨论】:

该表是个好主意,但对于接口类型来说有点错误。 (您还应该解释 depends 的含义 - 只有在包含的类型可比较时才允许。)对于接口类型,代码将编译,但如果在运行时包含的类型不可比较,则运行时将 恐慌.

以上是关于检查接口的相等性的主要内容,如果未能解决你的问题,请参考以下文章

带有类型检查的Scala相等性?

关于 useSelector 相等性检查

检查两个切片的相等性

如何检查排列是不是具有相等的奇偶性?

如何使用 cypress 检查元素内部文本的相等性?

FAQ运动健康服务REST API接口使用过程中常见问题和解决方法总结