我有以下代码:
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{}
不同。这是为什么?
答案 0 :(得分:6)
接口值打包两个数据:(1)类型和(2)该类型的值。关于比较的主题,the spec says:
界面值具有可比性。如果两个接口值具有相同的动态类型和相同的动态值,或者两者的值都为nil,则它们相等。
因此,两个数据片段必须相等才能使接口值相等。
在最后一个示例中,interface{}(a)
的动态类型为*int
,动态值为nil
,而interface{}(nil)
的动态类型为nil
(即没有类型集)和动态值nil
。由于类型不匹配,因此这两个值不相等。