在 Go 中,泛型接口和实现不允许跨不同类型参数直接赋值。
让我们考虑一下一个简化的示例:
// Abstract type Generic interface { ID() string } type Props[G Generic] struct{} // Example type Example struct { id string } func (example Example) ID() string { return example.id } var ExampleProps = Props[Example]{} // Problem func Problem() Props[Generic] { return ExampleProps }
此代码抛出一个编译错误,指出Props[Example] 不能在 return 语句中分配给 Props[Generic]。这是因为当使用不同类型参数实例化泛型类型时,Go 会创建不同的命名类型。
考虑以下函数:
func Problem() Props[Generic] { return ExampleProps }
它使用 Generic 作为类型参数实例化 Props。因此,即使 Example 实现了 Generic,Props[Example] 和 Props[Generic] 也变成了两种不同的类型。因此,将 Props[Example] 分配给 Props[Generic] 是无效的,无论其类型参数如何。
要解决此问题,一种选择是使用满足 Generic 约束的类型参数来实例化 Props:
// adding a field to make this a bit less contrived type Props[G Generic] struct{ Value G } // Props instantiated with T, adequately constrained func Problem[T Generic](v T) Props[T] { return Props[T]{ Value: v } } func main() { a := Problem(Example{}) fmt.Println(a) }
在此示例中,Props 使用符合 Generic 接口的类型参数 T 进行实例化。这允许将 Props[Example] 类型的值分配给 Props[Generic] 并确保类型安全。
以上是为什么我不能为 Go 泛型类型分配不同的参数?的详细内容。更多信息请关注PHP中文网其他相关文章!