我未能理解如何解决我目前在自己的应用程序中遇到的问题。
想象一下这个结构模型的示例,该结构模拟传入请求和将该请求中的字段放入数据库的函数。
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
的语义是否具有在基本上所有上下文中都有效的零值?
答案 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")
}