Go中interface != nil不一定不是nil
2024-01-02 20:40:07
摘要:
interface{} 值 != nil不一定不是nil,应使用reflect库判断是否是nil。
测试示例:
// todo interface != nil 不一定 不是nil
var value map[string]interface{}
reqMap := make(map[string]interface{})
reqMap["key"] = value
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)
}
断点调试
在进行到断点处时,会报错“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 不一定 不是nil
var value map[string]interface{}
reqMap := make(map[string]interface{})
reqMap["key"] = value
// 正确
value3, _ := reqMap["key"]
if !isNil(value3) { // 判断结果为false
var 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
}
}
文章来源:https://blog.csdn.net/t949500898/article/details/135345790
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!