首页 >后端开发 >Golang >**在 Go 中使用泛型进行切片初始化时如何保留接口-实现者关系?**

**在 Go 中使用泛型进行切片初始化时如何保留接口-实现者关系?**

DDD
DDD原创
2024-10-25 17:22:02569浏览

**How to Preserve Interface-Implementor Relationships When Using Generics in Go for Slice Initialization?**

Golang 泛型中的接口/实现同时性

考虑创建泛型函数以用初始化值填充切片的任务。虽然这看起来很简单,但在尝试利用接口切片并在函数中指定具体类型时会出现挑战。

在 Go 1.18 中,将 X 和 Y 限制为通用函数 Fill 中的任何类型会导致损失接口与其实现者之间的任何关系。这可以防止将 Y 的实例分配给函数内的 slice[i]。

为了克服这个问题,可以使用显式断言:

<code class="go">func Fill[X, Y any](slice []X) {
    for i := range slice {
        slice[i] = any(*new(Y)).(X)
    }
}</code>

但是,当 Y 时,此方法会出现恐慌。不实现 X。此外,对 Y 使用指针类型会导致丢失有关基本类型的信息和零基线值。

要解决这些问题,建议使用构造函数而不是第二个类型参数:

<code class="go">func main() {
    xs := make([]sync.Locker, 10)
    Fill(xs, func() sync.Locker { return &sync.Mutex{} })
}

func Fill[X any](slice []X, f func() X) {
    for i := range slice {
        slice[i] = f()
    }
}</code>

这种方法有效地使用构造函数创建的初始化值填充切片,为问题提供了更健壮和灵活的解决方案。

以上是**在 Go 中使用泛型进行切片初始化时如何保留接口-实现者关系?**的详细内容。更多信息请关注PHP中文网其他相关文章!

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