面试题答案
一键面试- 代码输出及原因分析:
- 这段代码会输出“参数不为nil”。
- 原因是在Go语言中,
interface{}
类型由一个类型信息和一个值信息组成。当向interface{}
类型变量传入nil
时,只有当类型信息和值信息都为nil
时,这个interface{}
类型变量才被认为是nil
。在checkNil
函数中,虽然传入的a
是*int
类型的nil
指针,但是当把它赋值给interface{}
类型的参数i
时,i
的类型信息是*int
,值信息是nil
,整体i
并不被认为是nil
,所以输出“参数不为nil”。
- 修改
checkNil
函数:
package main
import (
"fmt"
"reflect"
)
func checkNil(i interface{}) {
value := reflect.ValueOf(i)
if value.Kind() == reflect.Ptr && value.IsNil() {
fmt.Println("参数为nil")
} else {
fmt.Println("参数不为nil")
}
}
func main() {
var a *int
checkNil(a)
}
在这个修改后的checkNil
函数中,使用reflect.ValueOf
获取interface{}
参数的值,然后通过Kind
方法判断类型是否为指针类型,并且通过IsNil
方法判断指针是否为nil
,这样就能根据实际传入的nil
值做出正确判断。