无论何时我们查询一个容器来检索单个或一个子集的项目(通常通过提供一个 key ),而容器却找不到该项目或符合我们查询条件的项目,它可能会以nil
,null object,错误或异常或其他任何形式进行响应。
不同的编程语言可能提出不同的建议,但是在Go语言中尤其如此:
答案 0 :(得分:2)
在这种情况下必须如何实现容器?
没有必须,但是查看Go的map
可能会提供指导,这将带您进入常见的模式:
thing, found := container.Get(key) // 'ok' is often used instead of 'found'
通过这种方式,容器包含的东西 不必必须是指针。
当found
为false
时,可以确定容器不包含密钥,并且thing
将采用容器所包含内容的零值。如果是指针,则就像您的问题一样是nil
。
即使found
是true
,thing
仍可能是零值,即对于指针来说可能是nil
,nil
可能已被显式存储在key
处。
它也适用于数据库存储库吗?
我不确定100%是什么数据库存储库,但是这种模式可以很好地应用于最终访问数据库或键值存储的API。
而且,它有什么好处?
返回指示存在的显式标志的好处是,您不必依赖于零值指示未找到的隐式协议。这样您就可以释放存储零值并认为已找到它们的可能性。
例如,如果不允许使用Go,请考虑使用map[string]int
:
m := map[string]int{"foo": 0}
val, ok := m["foo"]
但仅:
val := m["foo"]
然后,将无法判断容器中是否存在foo
或bar
。
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 /容器的语义进行选择,以将不存在视为错误。