有没有一种很好的方法来模拟 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 并发送Xnil,但这很丑陋并且破坏了类型安全。

【问题讨论】:

在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 &areturn &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 结果?

Kotlin:如何将两个语句“应用”和“让”以一种很好的方式放在一起?

Laravel 以一种很好的方式使用多个控制器和视图

有没有一种很好、安全、快速的方法可以将 InputStream 写入 Scala 中的文件?