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
。由于类型不匹配,这两个值不相等。感谢您写得非常好的答案,非常感谢!