【问题标题】:Go and interface{} equalityGo 和 interface{} 相等
【发布时间】:2014-03-10 06:42:56
【问题描述】:

我有以下代码:

package main

import "fmt"

func main() {
    fmt.Println(interface{}(1) == interface{}(1))

    var a *int
    fmt.Println(a == nil)
    fmt.Println(interface{}(a) == interface{}(nil))
}

它输出:

true
true
false

我想知道为什么。在第一种情况下,可以看出将值包装在 interface{} 中并不会阻止确定相等性,但是将 nil 指针(等于 nil)包装在 interface{} 中并不相同作为interface{}(nil)。这是为什么呢?

【问题讨论】:

    标签: interface go


    【解决方案1】:

    一个接口值包含两部分数据:(1) 一个类型和 (2) 该类型的一个值。关于对比主题,the spec says

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

    因此,两个数据需要相等,接口值才能被视为相等。

    在您的最后一个示例中,interface{}(a) 具有动态类型 *int 和动态值 nil,而 interface{}(nil) 具有动态类型 nil(即未设置类型)和动态值的nil。由于类型不匹配,因此两个值不相等。

    【讨论】:

    • 感谢您写得非常好,非常感谢!
    猜你喜欢
    • 2017-04-10
    • 2013-12-02
    • 2019-03-31
    • 1970-01-01
    • 2016-09-18
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多