检查接口的相等性{}

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


var v interface{}

for i := 0; i < len(A); i++ {

  if (A[i] == v) {

    fmt.Println("Gotcha!")

    break

  }

}

在微不足道的情况下,类型是int. 但是,例如,如果类型是自定义的,我该怎么办struct?


哔哔one
浏览 112回答 3
3回答

catspeake

我提供了Go 编程语言规范中的以下内容相等运算符 == 和 != 适用于可比较的操作数。关于interface{}s 和structs:接口值具有可比性。如果两个接口值具有相同的动态类型和相等的动态值,或者两者的值为 nil,则它们相等。当类型 X 的值具有可比性且 X 实现 T 时,非接口类型 X 的值 x 和接口类型 T 的值 t 具有可比性。如果 t 的动态类型与 X 相同且 t 的动态值等于 x,则它们相等.如果所有字段都具有可比性,则结构值具有可比性。如果它们对应的非空白字段相等,则两个结构值相等。你也可以试试这个playground&nbsp;https://play.golang.org/p/bgO1_V87v9k换句话说,在 Go 中处理相等似乎很容易!

摇曳的蔷薇

更新:自从写了上述问题和答案后,Go 语言略有变化。以前,如果比较两个接口并且其中一个或两个接口包含不可比较的类型,则运行时会发生混乱。现在,只有当它们都包含相同的不可比较类型时,运行时才会恐慌。(如果它们包含不同的类型,那么即使任一类型是不可比较的,结果现在也是假的。)什么是不可比较的类型?基本上,它们是切片、映射、函数以及使用它们的任何结构或数组类型。AFAIK 这是围绕 Go 1.9 或 1.10 的无声变化。

红糖糍粑

我总结了 Go 类型的属性解释depends- 仅当包含的类型可比较时才允许。)对于接口类型,代码将编译,但如果在运行时包含的类型不可比较,则运行时将发生恐慌。感谢@Andrew W. Phillips。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go