Golang 泛型中的接口/实现同时性
考虑创建一个泛型函数以用初始化值填充切片的任务。虽然这看起来很简单,但当尝试利用接口切片并在函数中指定具体类型时,就会出现挑战。
在 Go 1.18 中,将 X 和 Y 限制为通用函数 Fill 中的任何类型会导致损失接口与其实现者之间的任何关系。这可以防止在函数内将 Y 的实例分配给 slice[i]。
要克服这个问题,可以使用显式断言:
func Fill[X, Y any](slice []X) {
for i := range slice {
slice[i] = any(*new(Y)).(X)
}
}
然而,当 Y 未实现 X 时,此方法会出现恐慌。此外,对 Y 使用指针类型会导致丢失有关基本类型和零基线值的信息。
To为了解决这些问题,建议使用构造函数而不是第二个类型参数:
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()
}
}
这种方法有效地使用构造函数创建的初始化值填充切片,为问题提供了更强大、更灵活的解决方案。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3