MST
星途 面试题库

面试题:Go中如何判断空接口的值为nil

在Go语言中,当一个空接口(interface{})实际存储的值为nil时,如何准确判断该空接口的值确实为nil?请举例说明。
23.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,当一个空接口实际存储的值为nil时,直接与nil比较并不能得到预期结果,因为此时接口的动态类型非nil,只有动态值为nil。要准确判断,需要结合类型断言或类型开关来实现。

示例代码如下:

package main

import (
    "fmt"
)

func main() {
    var i interface{}
    var s *string

    i = s
    if i == nil {
        fmt.Println("空接口值为nil")
    } else {
        fmt.Println("空接口值不为nil")
    }

    // 使用类型断言判断
    if v, ok := i.(*string); ok && v == nil {
        fmt.Println("空接口实际存储的值为nil")
    }

    // 使用类型开关判断
    switch v := i.(type) {
    case nil:
        fmt.Println("空接口值为nil")
    case *string:
        if v == nil {
            fmt.Println("空接口实际存储的值为nil")
        }
    default:
        fmt.Println("其他类型")
    }
}

在上述代码中:

  1. 首先声明了一个空接口i和一个*string类型的指针s,并将s赋值给i
  2. 直接判断i == nil会输出“空接口值不为nil”,因为此时接口有动态类型*string
  3. 使用类型断言i.(*string),先判断接口存储的值类型是否为*string,再判断其值是否为nil
  4. 使用类型开关,当类型为*string时,判断其值是否为nil