MST

星途 面试题库

面试题:Go空接口与nil判断在函数传递中的问题

假设有如下Go代码: ```go package main import "fmt" func checkNil(i interface{}) { if i == nil { fmt.Println("参数为nil") } else { fmt.Println("参数不为nil") } } func main() { var a *int checkNil(a) } ``` 这段代码会输出什么?请详细分析原因。如果希望实现根据实际传入的nil值做出正确判断,函数`checkNil`应该如何修改?
12.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 代码输出及原因分析
    • 这段代码会输出“参数不为nil”。
    • 原因是在Go语言中,interface{}类型由一个类型信息和一个值信息组成。当向interface{}类型变量传入nil时,只有当类型信息和值信息都为nil时,这个interface{}类型变量才被认为是nil。在checkNil函数中,虽然传入的a*int类型的nil指针,但是当把它赋值给interface{}类型的参数i时,i的类型信息是*int,值信息是nil,整体i并不被认为是nil,所以输出“参数不为nil”。
  2. 修改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值做出正确判断。