随着 Go 1.18 中泛型的出现,开发人员开始思考创建泛型的可能性[A, B] 类型之一。此类型表示一个值可以是 A 类型或 B 类型。此类类型有用的情况包括返回两个可能值之一的函数(例如,正常结果或错误)。
虽然 Go 中错误处理的惯用方法是返回“正常”值和错误值,但有些人认为这在语义上是不正确的,因为它意味着当意图返回 A 或 B 时,函数会同时返回 A 和 B B.
在 Go 中创建 Either 类型是一项挑战,因为它的接口必须包含一个接受两个函数作为参数的方法,一个用于类型 A,一个用于类型 B。但是,Go 不允许接口方法有类型参数。
要规避此限制,一种方法是借用 OCaml 等函数式编程语言的解决方案。在此解决方案中,我们定义了一个可选类型,它可以表示一个值,也可以不表示任何内容(即 None)。然后,我们定义一个 Either 类型,它包装了两种可选类型,一种用于类型 A,一种用于类型 B。
type Optional[T any] interface { get() (T, error) } 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 接口定义了方法来确定该值是 Left(类型 A)还是 a右键(类型 B)并检索包装的可选类型。 Left 和 Right 结构体实现这些方法来表示不同的情况。
以下是如何使用 Either 类型的示例:
import ( "fmt" "os" ) func main() { var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") fmt.Println(e1) fmt.Println(e2) 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) } } }
In在本例中,我们创建两个 Either 值:e1 是包含整数的 Left,e2 是包含字符串的 Right。我们演示如何使用 is_left() 和 is_right() 方法对 Either 值进行模式匹配,以访问底层值并相应地处理它们。
以上是我们如何在 Go 中实现通用的 Either 类型来处理 Either/Or 返回值?的详细内容。更多信息请关注PHP中文网其他相关文章!