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