问题 有没有一种很好的方法来模拟Go中的“Maybe”或“option”类型?


我正在通过a发送回复请求 chan X,哪里 X 是一个结构。请求是一个搜索操作,所以理想情况下我希望能够返回一个 X,或报告未找到。

这将是一项任务 Maybe X 在哈斯克尔或 x option 在OCaml。在Go中有什么好的方法吗?我没有返回一个指针(因为我正在返回的原始对象可能会在以后修改),所以我不能只返回 nil

编辑: 现在我正在制作它 chan interface{} 并发送一个 X 要么 nil,但这很丑陋,打败了类型安全。


1994
2018-04-03 12:23


起源

在 github.com/alphazero/future.go 我选择了元组(interface {},flag)作为通道有效负载。有趣的是,昨天推了它。 - alphazero


答案:


如果你正在使用 interface {} 你现在有效地返回一个指针。为什么不改变 interface {} 至 *X 并确保返回该对象的副本?如果我理解你的理由背后没有使用 chan *X, 那是。


2
2018-04-03 12:32



呃,是的,你这样做。我想这是一个选择。是最便宜/最简单的方法来调用它 &*object? (如果这是允许的话(我会检查。)) - Ashe
我可以想到的两种方式而不使用 reflect 包是 a := b; return &a 和 return &thistype{thisfield:b.thisfield, thisotherfield:b.thisotherfield}。我没有基准测试,但前者使用较少的指令。 - mkb
它肯定使用较少的代码,而不是维护问题,所以我会继续使用它。干杯! - Ashe


我使用指针类型,其中:

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

7
2018-01-10 11:51





另一种方法是添加一个ok bool。你可以将它添加到X或包装X,就像 struct {X; ok bool}


3
2018-04-03 20:13





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

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


1
2018-04-14 06:48