是否需要冗余检查来映射给定的字符串零值



我们有一个map[string]string,我假设这意味着从映射中检索到的字符串的零值是""

这不意味着:

var userId, ok = params["user_id"];
if !ok || userId == "" {
return 422, "Missing user_id in request"
}

与此逻辑相同:

var userId = params["user_id"];
if  userId == "" {
return 422, "Missing user_id in request"
}

只是确保我的理解是正确的。

如果您打算存储值类型的零值,这就不一样了。

参见此示例:

m := map[string]string{
"empty": "",
}
if v, ok := m["empty"]; ok {
fmt.Printf("'empty' is present: %qn", v)
} else {
fmt.Println("'empty' is not present")
}
if v, ok := m["missing"]; ok {
fmt.Printf("'missing' is present: %qn", v)
} else {
fmt.Printf("'missing' is not present")
}

它输出(在Go Playground上尝试(:

'empty' is present: ""
'missing' is not present

的确,如果从不在映射中存储零值,则可以简单地使用if m[value] == zeroValue {}。这里详细介绍:如何在Go中检查地图是否包含密钥?

映射的这种"属性"可以用来优雅地创建集合。请参阅如何创建包含唯一字符串的数组?

使用这种"技术"还有另一个优点:您可以以紧凑的方式检查多个键的存在(使用特殊的"comma-ok"形式无法做到这一点(。更多关于这个:检查钥匙是否存在于一个条件下的多个地图

最新更新