面试题答案
一键面试原因分析
在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
,因为虽然 s
是 nil
,但它的类型是 *string
,所以 i
有非 nil
的类型,导致判断失败。
解决方案
- 类型断言结合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")
}
}
}
- 使用
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")
}
}