检查接口{}的相等性

时间:2015-12-12 22:51:28

标签: go types interface equality

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

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

在简单的情况下,类型为int。但是,如果类型是某些自定义struct,我该怎么办?

3 个答案:

答案 0 :(得分:24)

感谢@CodingPickle评论,我从Go Programming Language Specification

提供以下内容
  

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

关于interface{}structs

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

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

答案 1 :(得分:0)

更新:自从上面的问题和答案被编写以来,Go语言已经发生了微小变化。

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

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

对AFAIK来说,这是Go 1.9或1.10的无声更改。

答案 2 :(得分:0)

我对Go类型的属性进行了总结

properties of Go types

说明

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