检查接口的相等性{}

Checking equality of interface{}

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

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

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

感谢@CodingPickle 的评论,我提供了 Go Programming Language Specification

中的以下内容

The equality operators == and != apply to operands that are comparable.

关于 interface{}structs

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

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

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

更新:自从写了上面的问题和答案后,Go 语言发生了轻微的变化。

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

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

据我所知,这是围绕 Go 1.9 或 1.10 的无声更改。

我总结了 Go 类型的属性

说明

  • depends - 仅当包含的类型具有可比性时才允许。)对于 Interface 类型,代码将编译,但如果在运行时包含的类型是不可比,那么运行时将出现 panic。感谢@Andrew W. Phillips。
reflect.DeepEqual(x, y any) bool

成功了。