更新于 

interface赋值为nil,类型变化

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

package main

import "fmt"

func main() {
var p *int = nil
var i interface{} = nil
fmt.Printf("%T---%T\n", p, i)
if p == i {
fmt.Println("Equal")
} else {
fmt.Println("Not Equal")
}

}

// 输出
// *int---<nil>
// Not Equal

解释

首先 p 类型为 *int 类型是没有问题的

但是 i 变量的类型 变成了 nil,为什么?

chatGPT 给的解释:

在 Go 中,一个接口值包含两个部分:一个具体的类型和一个具体的值。当你将一个 nil 值赋给一个接口变量时,这个接口变量的类型部分会变成 nil,但它仍然是一个合法的接口。

这意味着尽管 i 是一个接口类型的变量,但它的类型部分是 nil。当你使用 %T 格式化符号来打印它的类型时,它会显示为 nil 类型。