为了账号安全,请及时绑定邮箱和手机立即绑定

检查接口的相等性{}

检查接口的相等性{}

Go
哔哔one 2021-11-29 16:01:56
我正在搜索[]interface{}一个给定interface{}值的切片:var v interface{}for i := 0; i < len(A); i++ {  if (A[i] == v) {    fmt.Println("Gotcha!")    break  }}在微不足道的情况下,类型是int. 但是,例如,如果类型是自定义的,我该怎么办struct?
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

我提供了Go 编程语言规范中的以下内容

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

关于interface{}s 和structs

  • 接口值具有可比性。如果两个接口值具有相同的动态类型和相等的动态值,或者两者的值为 nil,则它们相等。

  • 当类型 X 的值具有可比性且 X 实现 T 时,非接口类型 X 的值 x 和接口类型 T 的值 t 具有可比性。如果 t 的动态类型与 X 相同且 t 的动态值等于 x,则它们相等.

  • 如果所有字段都具有可比性,则结构值具有可比性。如果它们对应的非空白字段相等,则两个结构值相等。

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

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


查看完整回答
反对 回复 2021-11-29
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

更新:自从写了上述问题和答案后,Go 语言略有变化。

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

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

AFAIK 这是围绕 Go 1.9 或 1.10 的无声变化。


查看完整回答
反对 回复 2021-11-29
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

我总结了 Go 类型的属性

//img1.sycdn.imooc.com//61a4892a0001f72907510650.jpg

解释

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


查看完整回答
反对 回复 2021-11-29
  • 3 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信