【问题标题】:Is there a nice way to simulate a "Maybe" or "option" type in Go?有没有一种很好的方法来模拟 Go 中的“可能”或“选项”类型?
【发布时间】:2012-04-17 02:26:56
【问题描述】:

我正在通过chan X 发送对请求的回复,其中X 是一个结构。该请求是一个搜索操作,所以理想情况下我希望能够返回X,或者报告它没有找到。

这将是 Haskell 中的 Maybe X 或 OCaml 中的 x option 的任务。在 Go 中有什么体面的方法可以做到这一点吗?我没有返回一个指针(因为我返回的原始对象可能稍后会被修改),所以我不能只返回nil

编辑:现在我将其设为chan interface{} 并发送Xnil,但这很丑陋并且破坏了类型安全。

【问题讨论】:

标签: types go nullable


【解决方案1】:

我使用的是指针类型,其中:

  • Maybe X = *X
  • Nothing = nil
  • Just x = &x

【讨论】:

    【解决方案2】:

    如果您使用interface {},您现在实际上是在返回一个指针。为什么不将interface {} 更改为*X 并确保返回对象的副本?如果我理解您不使用chan *X 的原因,那就是。

    【讨论】:

    • 嗯,是的。我想这是一个选择。将其称为&*object 是最便宜/最简单的方法吗? (如果允许的话(我会检查的。))
    • 不使用reflect 包我能想到的两种方法是a := b; return &areturn &thistype{thisfield:b.thisfield, thisotherfield:b.thisotherfield}。我没有进行基准测试,但前者使用的指令较少。
    • 它使用的代码肯定更少,维护问题也更少,所以我会继续这样做。干杯!
    【解决方案3】:

    另一种方法是添加一个 ok bool。您可以将其添加到 X 或包装 X,例如 struct {X; ok bool}

    【讨论】:

      【解决方案4】:

      我最近需要表示一个可选的/可能是我不想使用指针并且不能依赖零值的类型。我最终选择编写以下内容,它将为您包装任何类型。它也可能适合您的用例。

      https://github.com/leighmcculloch/go-optional

      【讨论】:

        猜你喜欢
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-17
        • 1970-01-01
        相关资源
        最近更新 更多