首页 >后端开发 >Golang >为什么 Go 的泛型类型和不同类型参数不能互相赋值?

为什么 Go 的泛型类型和不同类型参数不能互相赋值?

Linda Hamilton
Linda Hamilton原创
2024-12-19 11:22:09578浏览

Why Can't Go's Generic Types with Different Type Arguments Be Assigned to Each Other?

为什么相同类型的泛型实例不能互相赋值?

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

出现此错误是因为使用新类型参数实例化泛型类型会创建一种独特的类型。具体来说:

  • Props[Example] 是一种命名类型,
  • Props[Generic] 是另一种命名类型。

这两种类型不是尽管示例实现了通用,但可以互换。因此,将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中文网其他相关文章!

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