Go 中的泛型任一类型实现
在 Go 1.18 中,泛型为表达复杂概念提供了有希望的可能性。其中一个概念是 Either 类型,它可以表示 A 类型或 B 类型的值。本文探讨了在 Go 的新泛型范例中实现 Either 类型的潜在方法。
挑战来自于 Go 对没有类型参数的接口方法。这个障碍阻止了 Either 接口的直接实现。
使用Optional 模拟Either
一种方法是适应Option 的函数式编程概念。 Optional[T] 接口可以表示 T 类型的值或不存在值。通过利用Go的泛型,我们可以扩展这个想法,为A或B创建一个Optional。
type Optional[T any] interface { get() (T, error) } func CreateNone[T any]() Optional[T] { return None[T]{} } func CreateSome[T any](data T) Optional[T] { return Some[T]{data} }
实现任一
随着Optional的建立,我们现在可以构造一个利用它的 Either 类型。
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] }
Left 和 Right 结构代表类型 A 和分别是B。 is_left 和 is_right 指示 Either 持有哪种类型。 find_left 和 find_right 为各自的值提供可选包装器。
type Left[A, B any] struct { data A } func left[A, B any](data A) Either[A, B] { return Left[A, B]{data} } type Right[A, B any] struct { data B } func right[A, B any](data B) Either[A, B] { return Right[A, B]{data} }
用法
实现的 Either 类型可以按如下方式使用:
var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") if e1.is_left() { if l, err := e1.find_left().get(); err == nil { fmt.Printf("The int is: %d\n", l) } }
这种方法有效地模拟了 Either 类型,同时尊重 Go 的接口约束。它允许表达可能属于两种类型之一的值,从而在 Go 代码中提供更大的灵活性和类型安全性。
以上是我们如何使用泛型和可选值在 Go 中实现泛型任一类型?的详细内容。更多信息请关注PHP中文网其他相关文章!