首页 > 后端开发 > Golang > 我们如何使用泛型和可选值在 Go 中实现泛型任一类型?

我们如何使用泛型和可选值在 Go 中实现泛型任一类型?

Barbara Streisand
发布: 2024-12-24 19:55:25
原创
587 人浏览过

How Can We Implement a Generic Either Type in Go Using Generics and Optionals?

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

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