首页 >后端开发 >Golang >为什么我不能在 Go 中将一种泛型类型分配给另一种类型,即使它们的类型参数兼容?

为什么我不能在 Go 中将一种泛型类型分配给另一种类型,即使它们的类型参数兼容?

DDD
DDD原创
2025-01-04 12:30:33607浏览

Why Can't I Assign One Generic Type to Another in Go, Even If Their Type Arguments Are Compatible?

理解泛型类型赋值限制

在 Go 中,一个泛型不能被赋值给另一个,即使它们的类型参数可能是由于泛型实例化的性质所致。

通用类型Go

泛型类型允许通过定义可与不同数据类型一起使用的模板来重用代码。实例化泛型类型时,您可以提供具体类型参数来指定所使用的特定数据类型。

赋值限制

将一种泛型类型的值分配给另一种泛型类型可能会并不总是被允许。这是因为使用不同类型参数实例化泛型类型会产生两个不同的命名类型。

例如:

type Props[G Generic] struct{}

type Example struct{}

func (Example) ID() string { return "" }

var ExampleProps = Props[Example]{}

func Problem() Props[Generic] {
    return ExampleProps // Compilation error
}

在此示例中,Example 实现了 Generic 接口。但是,Props[Example] 和 Props[Generic] 仍然被视为不同的类型。因此,不允许将ExampleProps(类型为Props[Example])分配给Problem(返回Props[Generic])。

解决方案

如果你想要要在泛型类型之间分配值,可以使用类型参数实例化泛型类型。例如:

func Problem[T Generic](v T) Props[T] {
    return Props[T]{Value: v}
}

在这种情况下,Problem 采用泛型参数 T 并用 T 实例化 Props。这提供了更大的灵活性,并且可以在类型参数满足特定条件的情况下使用。

以上是为什么我不能在 Go 中将一种泛型类型分配给另一种类型,即使它们的类型参数兼容?的详细内容。更多信息请关注PHP中文网其他相关文章!

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