Go interface{} == nil 可得悠着点

130 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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)
    • 所以,两者不相等

如果本文对你有帮助,欢迎点赞收藏加关注,如果本文有错误的地方,欢迎指出!