首页 > 后端开发 > Golang > 我们如何在 Go 中实现通用的 Either 类型来处理 Either/Or 返回值?

我们如何在 Go 中实现通用的 Either 类型来处理 Either/Or 返回值?

Susan Sarandon
发布: 2024-12-07 13:45:16
原创
256 人浏览过

How Can We Implement a Generic Either Type in Go to Handle Either/Or Return Values?

在 Go 中实现泛型任一类型

简介

随着 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板