我们有一个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"形式无法做到这一点(。更多关于这个:检查钥匙是否存在于一个条件下的多个地图