在Golang中处理可选的布尔值

时间:2018-04-12 19:43:25

标签: go

我未能理解如何解决我目前在自己的应用程序中遇到的问题。

想象一下这个结构模型的示例,该结构模拟传入请求和将该请求中的字段放入数据库的函数。

type NewBooleanRequest struct {
    RequiredString string `json:"requiredString"`
    OptionalBoolean bool `json:"maybeBoolean"`
}

func LogBooleanRequest(req NewBooleanRequest, db *sql.DB) {
    db.Exec("INSERT INTO log (booleanValue, stringValue) VALUES ($1, $2)", req.OptionalBoolean, req.RequiredString)
}

现在这显然可行,如果我知道我的请求模型的所有字段都会得到一个值,但这不是现实中的常见要求。人们通常如何建模"可选" bool的值是bool的语义是否具有在基本上所有上下文中都有效的零值?

2 个答案:

答案 0 :(得分:8)

这个问题并不是针对布尔值的,所有NULLable类型都是常见的。最简单的解决方案是使用指针(在您的示例中为*bool)。 sql包提供的常见类型也有Nullable值。在这种情况下,sql.NullBool将是您想要的那个。

答案 1 :(得分:0)

除了已接受的答案,我发现这个有趣的库 https://github.com/guregu/null 可以很好地处理可空值。声明 API 请求参数而不会弄乱服务器路由上的 sql 库(这不是那么相关)非常有用。

对于您的情况,您可以像这样写您的请求:

type NewBooleanRequest struct {
    RequiredString string `json:"requiredString"`
    OptionalBoolean null.Bool `json:"maybeBoolean"`
}
request := NewBooleanRequest {
    RequiredString: "Your string",
    OptionalBoolean: null.BoolFrom(false)
}

if request.OptionalBoolean.Valid {
    fmt.Println(request.OptionalBoolean.Bool) // Print "false"
} else {
    fmt.Println("request.OptionalBoolean is NULL")
}