Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Interface Go与接口{}相等_Interface_Go - Fatal编程技术网

Interface Go与接口{}相等

Interface Go与接口{}相等,interface,go,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 我想知道为什么。在第一种情况下,可以看到在接口{}中包装值并不

我有以下代码:

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

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

一个接口值包含两段数据:(1)一个类型和(2)该类型的一个值。关于比较问题:

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

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


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

感谢您写得非常好的答案,非常感谢!