Go 处理可选布尔值

Go 处理可选布尔值,go,Go,我无法理解如何解决我在自己的应用程序中遇到的问题 想象一下这个示例中的一个结构,它对传入的请求进行建模,并使用一个函数将该请求中的字段放入数据库 type NewBooleanRequest struct { RequiredString string `json:"requiredString"` OptionalBoolean bool `json:"maybeBoolean"` } func LogBooleanRequest(re

我无法理解如何解决我在自己的应用程序中遇到的问题

想象一下这个示例中的一个结构,它对传入的请求进行建模,并使用一个函数将该请求中的字段放入数据库

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
值建模“可选”语义?

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

可为空的布尔值不再是真正的布尔值,在这一点上它是三个选项的枚举。@Adrian:当然,但这与问题无关。@Adrian:不,不太可能。“bool”是一条红鲱鱼。这个问题实际上是关于所有可选/可空类型的。可为空的bool与可为空的字符串是字符串的方式和程度完全相同。@Adrian:不,可为空的数据类型不是错误设计的结果。它们可以用于糟糕的设计,但任何其他合法的功能也可以。@Adrian:如果不是bool,你不会说同样的话,这一事实更多地说明了你,而不是这个问题。对不起,打字错误——我想问一下,引入可选的包装器类型,而不仅仅是使用指针实现有限的可选语义集,这主要取决于您将如何与值交互,是否有什么好处。在某些情况下,处理指针可能会很麻烦。试试一个,如果你觉得很痛苦,我想试试另一个。