检查接口的相等性{}
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
成功了。
我正在为给定的 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
成功了。