检查接口的相等性
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 提供以下内容
等式运算符 == 和 != 适用于可比较的操作数。
关于interface
s 和structs
:
你也可以试试这个游乐场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
的含义 - 只有在包含的类型可比较时才允许。)对于接口类型,代码将编译,但如果在运行时包含的类型不可比较,则运行时将 恐慌.以上是关于检查接口的相等性的主要内容,如果未能解决你的问题,请参考以下文章