在容器中找不到商品是错误的吗?

时间:2019-01-04 10:55:21

标签: go containers

无论何时我们查询一个容器来检索单个或一个子集的项目(通常通过提供一个 key ),而容器却找不到该项目或符合我们查询条件的项目,它可能会以nilnull object,错误或异常或其他任何形式进行响应。

不同的编程语言可能提出不同的建议,但是在Go语言中尤其如此:

  • 在这种情况下必须如何实现容器
  • 它也适用于数据库存储库吗?
  • 而且,它有什么好处?

1 个答案:

答案 0 :(得分:2)

  

在这种情况下必须如何实现容器?

没有必须,但是查看Go的map可能会提供指导,这将带您进入常见的模式:

thing, found := container.Get(key) // 'ok' is often used instead of 'found'

通过这种方式,容器包含的东西 不必必须是指针。

foundfalse时,可以确定容器不包含密钥,并且thing将采用容器所包含内容的零值。如果是指针,则就像您的问题一样是nil

即使foundtruething仍可能是零值,即对于指针来说可能是nilnil可能已被显式存储在key处。

  

它也适用于数据库存储库吗?

我不确定100%是什么数据库存储库,但是这种模式可以很好地应用于最终访问数据库或键值存储的API。

  

而且,它有什么好处?

返回指示存在的显式标志的好处是,您不必依赖于零值指示未找到的隐式协议。这样您就可以释放存储零值并认为已找到它们的可能性。

例如,如果不允许使用Go,请考虑使用map[string]int

m := map[string]int{"foo": 0}
val, ok := m["foo"]

但仅:

val := m["foo"] 

然后,将无法判断容器中是否存在foobar

val := m["foo"]  // val == 0 explicitly stored
val2 := m["bar"] // val2 == 0 default zero value, not stored

但是:

val, ok := m["foo"] // val == 0 explicitly stored, ok == true (found)
val, ok = m["bar"]  // val == 0 still but ok == false (not found)

在这种情况下,您可以非常明确地了解存在/不存在状态。由此,您可以根据API /容器的语义进行选择,以将不存在视为错误。