随着 Go 1.18 中泛型的引入,创建泛型数据结构成为可能,例如 Either 类型,可以表示两个可能值中的一个。这解决了返回值和错误的限制,就像处理错误的惯用 Go 方法一样。
实现通用 Either 类型的一种方法涉及使用 None 类型和Optional 接口。 None 表示没有值,而Optional 提供了一种检索值或错误的方法。此外,Left 和 Right 类型被定义为表示 Either 可以保存的两个可能的值。
type Optional[T any] interface { get() (T, error) } type None[T any] struct {} type Some[T any] struct { data T }
Either 接口提供了确定它是否保存左值或右值的方法,以及访问这两种类型的方法使用 find 方法查找值。
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] } type Left[A, B any] struct { data A } type Right[A, B any] struct { data B }
提供了帮助函数来创建 Either 实例并访问它们
func left[A, B any](data A) Either[A, B] func right[A, B any](data B) Either[A, B]
以下示例演示了 Either 类型的用法:
var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") fmt.Println(e1) fmt.Println(e2)
输出将是:
left(4143) right(G4143)
通过访问 is_left 和is_right 方法,可以确定 Either 所持有的值的类型。使用 find_left 和 find_right 方法,可以检索实际值。
if e1.is_left() { if l, err := e1.find_left().get(); err == nil { fmt.Printf("The int is: %d\n", l) } else { fmt.Fprintln(os.Stderr, err) } } if e2.is_right() { if r, err := e2.find_right().get(); err == nil { fmt.Printf("The string is: %s\n", r) } else { fmt.Fprintln(os.Stderr, err) } }
此示例演示如何使用 Either 类型以灵活且类型安全的方式表示和处理不同类型的值。
以上是如何使用 Go 的泛型来实现灵活且类型安全的任一类型?的详细内容。更多信息请关注PHP中文网其他相关文章!