去和接口{}相等

时间:2014-02-12 05:32:43

标签: interface go

我有以下代码:

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{}中包装一个值并不会停止确定相等性,而是一个包含在{{1}中的nil指针(等于nil) }}与interface{}不同。这是为什么?

1 个答案:

答案 0 :(得分:6)

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

  

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

因此,两个数据片段必须相等才能使接口值相等。

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