开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14天,点击查看活动详情
前言
由于接口类型的值可以是任意一个实现了该接口的类型值,所以接口值除了需要记录具体值之外,还需要记录这个值属于的类型。也就是说接口值由"类型Type"和"值Value"组成
一个接口只有 Type == nil 并且 Value == nil,该接口才等于 nil
interface{} == nil
package main
import (
"fmt"
)
func main() {
var p *int = nil
var v interface{} = p
fmt.Println(v == p)
fmt.Println(p == nil)
fmt.Println(v == nil)
}
输出结果:
true true false
为什么呢?下面来具体解释一下
-
首先:将一个
指针 nil 值p 赋值给接口 nil 值v, 赋值完成后,v 的内部字段为(Type = *int, Value = nil) -
第一个比较: v 与 p 比较时,将 p 转换为接口类型后再进行比较
- p 转换为接口类型后等于 (Type = *int, Value = nil)
- v 等于 (Type = *int, Value = nil)
- 所以,两者相等
-
第二个比较: p 与 nil 比较时,直接比较值,两者相等
-
第三个比较: v 与 nil 比较时,将 nil 转换为接口类型后再进行比较
- nil 转换为接口类型后等于 (Type = nil, Value = nil)
- v 等于 (Type = *int, Value = nil)
- 所以,两者不相等
为什么呢?下面来具体解释一下
-
首先:将一个
指针 nil 值p 赋值给接口 nil 值v, 赋值完成后,v 的内部字段为(Type = *int, Value = nil) -
第一个比较: v 与 p 比较时,将 p 转换为接口类型后再进行比较
- p 转换为接口类型后等于 (Type = *int, Value = nil)
- v 等于 (Type = *int, Value = nil)
- 所以,两者相等
-
第二个比较: p 与 nil 比较时,直接比较值,两者相等
-
第三个比较: v 与 nil 比较时,将 nil 转换为接口类型后再进行比较
- nil 转换为接口类型后等于 (Type = nil, Value = nil)
- v 等于 (Type = *int, Value = nil)
- 所以,两者不相等
如果本文对你有帮助,欢迎点赞收藏加关注,如果本文有错误的地方,欢迎指出!