面试题答案
一键面试在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("其他类型")
}
}
在上述代码中:
- 首先声明了一个空接口
i
和一个*string
类型的指针s
,并将s
赋值给i
。 - 直接判断
i == nil
会输出“空接口值不为nil”,因为此时接口有动态类型*string
。 - 使用类型断言
i.(*string)
,先判断接口存储的值类型是否为*string
,再判断其值是否为nil
。 - 使用类型开关,当类型为
*string
时,判断其值是否为nil
。