ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Go中interface != nil不一定不是nil

2026/9/24 6:22:52 拓冰建站 浏览量
Go中interface != nil不一定不是nil

摘要:

interface{} 值 != nil不一定不是nil,应使用reflect库判断是否是nil。

测试示例:

// todo interface != nil 不一定 不是nil
var value map[string]interface{}
reqMap := make(map[string]interface{})
reqMap["key"] = valuevalue2, ok := reqMap["key"]
if ok {fmt.Print("ok = true\n")
} else {fmt.Printf("ok = false, value = %v\n", value2)
}if ok {var convertValue map[string]interface{}var newMap map[string]interface{}convertValue = value2.(map[string]interface{})newMap["new"] = convertValuefmt.Print(convertValue)
}

断点调试
在这里插入图片描述
在进行到断点处时,会报错“assignment to entry in nil map”
在这里插入图片描述

我们不能对一个map的value赋值为nil,在此处如果仅通过判断interface{}是否为nil,此处可能导致误判,所以这里建议通过反射进行判断。

修改方法


// CodeExplore .
func CodeExplore(ctx context.Context) {logs.CtxInfo(ctx, "hello world")// todo interface != nil 不一定 不是nilvar value map[string]interface{}reqMap := make(map[string]interface{})reqMap["key"] = value// 正确value3, _ := reqMap["key"]if !isNil(value3) {  // 判断结果为falsevar newMap map[string]interface{}newMap["new"] = value3}// 错误//value2, ok := reqMap["key"]//if ok {//	fmt.Print("ok = true\n")//} else {//	fmt.Printf("ok = false, value = %v\n", value2)//}//if ok {//	var convertValue map[string]interface{}//	var newMap map[string]interface{}//	convertValue = value2.(map[string]interface{})//	newMap["new"] = convertValue//	fmt.Print(convertValue)//}return
}func isNil(val interface{}) bool {if val == nil {return true}v := reflect.ValueOf(val)k := v.Kind()switch k {case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.UnsafePointer, reflect.Interface, reflect.Slice:return v.IsNil()default:return false}
}