为什么相同类型的泛型实例不能互相赋值?
Go 禁止给不同类型的泛型实例赋值彼此的参数,即使类型参数满足接口关系。为了说明这一点,请考虑以下代码:
type Generic interface { ID() string } type Props[G Generic] struct{} type Example struct { id string } func (example Example) ID() string { return example.id } var ExampleProps = Props[Example]{} func Problem() Props[Generic] { return ExampleProps }
执行此代码会导致编译错误:
cannot use ExampleProps (variable of type Props[Example]) as Props[Generic] value in return statement
出现此错误是因为使用新类型参数实例化泛型类型会创建一种独特的类型。具体来说:
这两种类型不是尽管示例实现了通用,但可以互换。因此,将ExampleProps(Props[Example]的实例)分配给Props[Generic]是无效的。
此行为扩展到使用any实例化的泛型。 any 只是一个为空接口别名的静态类型:interface{}。它不等同于“any type”或 T。因此,使用 any 实例化的类型不能分配给使用其他特定类型实例化的类型。
要解决此问题,您可以使用类型参数实例化 Props ,确保函数的输入和输出类型一致。例如:
type Props[G Generic] struct{ Value G } func Problem[T Generic](v T) Props[T] { return Props[T]{ Value: v } } func main() { a := Problem(Example{}) fmt.Println(a) }
以上是为什么 Go 的泛型类型和不同类型参数不能互相赋值?的详细内容。更多信息请关注PHP中文网其他相关文章!