有没有一种很好的方法来模拟 Go 中的“可能”或“选项”类型?
Posted
技术标签:
【中文标题】有没有一种很好的方法来模拟 Go 中的“可能”或“选项”类型?【英文标题】:Is there a nice way to simulate a "Maybe" or "option" type in Go? 【发布时间】:2012-04-17 02:26:56 【问题描述】:我正在通过chan X
发送对请求的回复,其中X
是一个结构。该请求是一个搜索操作,所以理想情况下我希望能够返回X
,或者报告它没有找到。
这将是 Haskell 中的 Maybe X
或 OCaml 中的 x option
的任务。在 Go 中有什么体面的方法可以做到这一点吗?我没有返回一个指针(因为我返回的原始对象可能稍后会被修改),所以我不能只返回nil
。
编辑:现在我将其设为chan interface
并发送X
或nil
,但这很丑陋并且破坏了类型安全。
【问题讨论】:
在github.com/alphazero/future.go 中,我选择了元组 (interface, flag) 作为通道负载。有意思的是,昨天推送了。 【参考方案1】:我使用的是指针类型,其中:
Maybe X
= *X
Nothing
= nil
Just x
= &x
【讨论】:
【参考方案2】:如果您使用interface
,您现在实际上是在返回一个指针。为什么不将interface
更改为*X
并确保返回对象的副本?如果我理解您不使用chan *X
的原因,那就是。
【讨论】:
嗯,是的。我想这是一个选择。将其称为&*object
是最便宜/最简单的方法吗? (如果允许的话(我会检查的。))
不使用reflect
包我能想到的两种方法是a := b; return &a
和return &thistypethisfield:b.thisfield, thisotherfield:b.thisotherfield
。我没有进行基准测试,但前者使用的指令较少。
它使用的代码肯定更少,维护问题也更少,所以我会继续这样做。干杯!【参考方案3】:
另一种方法是添加一个 ok bool。您可以将其添加到 X 或包装 X,例如 struct X; ok bool
【讨论】:
【参考方案4】:我最近需要表示一个可选的/可能是我不想使用指针并且不能依赖零值的类型。我最终选择编写以下内容,它将为您包装任何类型。它也可能适合您的用例。
https://github.com/leighmcculloch/go-optional
【讨论】:
以上是关于有没有一种很好的方法来模拟 Go 中的“可能”或“选项”类型?的主要内容,如果未能解决你的问题,请参考以下文章
有没有一种很好的跨平台方法来使用 CMake 包含外部 C++ 库?
有没有办法以从 django 视图中作为上下文传递的一种很好的方式在 html 中显示 json 结果?