MST

星途 面试题库

面试题:Go空接口作为函数参数传递时nil值判断的陷阱

假设你有一个函数,其参数为一个空接口类型,在函数内部对传入的空接口参数进行nil值判断。然而实际运行中发现判断结果与预期不符,可能是什么原因导致的?请从Go语言的底层原理分析并给出解决方案。
43.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

原因分析

在Go语言中,空接口 interface{} 由一个类型和一个值组成。当一个空接口为 nil 时,它的类型和值都为 nil。但如果仅值为 nil,而类型不为 nil,这个空接口并不为 nil。例如:

var i interface{}
var s *string = nil
i = s
if i == nil {
    fmt.Println("i is nil")
} else {
    fmt.Println("i is not nil")
}

上述代码中,i 实际并不为 nil,因为虽然 snil,但它的类型是 *string,所以 i 有非 nil 的类型,导致判断失败。

解决方案

  1. 类型断言结合nil判断: 可以先进行类型断言,然后再判断值是否为 nil。例如:
func checkNil(i interface{}) {
    if s, ok := i.(*string); ok {
        if s == nil {
            fmt.Println("the value is nil")
        } else {
            fmt.Println("the value is not nil")
        }
    }
}
  1. 使用 reflect: 通过 reflect.Value 来获取值并判断是否为 nil。例如:
import "reflect"

func checkNilWithReflect(i interface{}) {
    v := reflect.ValueOf(i)
    if v.Kind() == reflect.Ptr && v.IsNil() {
        fmt.Println("the value is nil")
    }
}