检查接口{}的相等性

Bri*_*ian 19 types equality interface go

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

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

在琐碎的情况下,类型是int.但是,如果,例如,类型是一些自定义,我该怎么办struct

Bri*_*ian 28

感谢@CodingPickle评论,我从Go编程语言规范中提供了以下内容

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

关于interface{}s和structs:

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

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


wea*_*ing 8

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

Go 类型的属性

解释

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

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

And*_*ips 6

我正在纠正我之前的答案,因为我现在认为它是错误的。当比较两个接口值时,只有当它们具有相同类型并且不可比较时,运行时才会出现恐慌。如果它们包含不同的类型,则即使一种或两种类型不可比较,结果也为 false。

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


Ken*_*Ken 5

reflect.DeepEqual(x, y any) bool
Run Code Online (Sandbox Code Playgroud)

工作了。