【问题标题】: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.

标签: go types interface equality


【解决方案1】:

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

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

关于interface{}s 和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 的含义 - 只有在包含的类型可比较时才允许。)对于接口类型,代码将编译,但如果在运行时包含的类型不可比较,则运行时将 恐慌.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 2015-08-09
      • 2015-11-23
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多