首页 >后端开发 >Golang >如何使用 Go 的泛型来实现灵活且类型安全的任一类型?

如何使用 Go 的泛型来实现灵活且类型安全的任一类型?

Barbara Streisand
Barbara Streisand原创
2024-12-09 01:34:09231浏览

How Can Go's Generics Be Used to Implement a Flexible and Type-Safe Either Type?

在 Go 中实现泛型 Either 类型

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn