首页 >后端开发 >Golang >为什么我不能为 Go 泛型类型分配不同的参数?

为什么我不能为 Go 泛型类型分配不同的参数?

Susan Sarandon
Susan Sarandon原创
2024-12-20 05:56:10125浏览

Why Can't I Assign Go Generic Types with Different Arguments?

使用不同参数分配泛型类型

在 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中文网其他相关文章!

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