首页 > 后端开发 > Golang > 为什么 Go 泛型会抛出'item.SetId undefined”错误以及如何修复它们?

为什么 Go 泛型会抛出'item.SetId undefined”错误以及如何修复它们?

Linda Hamilton
发布: 2024-11-05 01:54:02
原创
949 人浏览过

Why Does Go Generics Throw

使用泛型:了解指针类型注意事项

错误难题

在 Go 中使用泛型时,您可能会遇到以下错误:

item.SetId undefined(类型 *T 是指向类型参数的指针,而不是类型参数)

尝试使用泛型实现对象存储时会出现此错误。问题源于这样一个事实:类型参数 T 不是指向其自身 *T 的指针。因此,在具体类型 T 上定义的指针接收器方法不会隐式包含在 *T 的方法集中。

解决类型参数问题

要解决这个问题,您需要显式指定约束 T 应该是实现 GS 接口并具有 SetId 方法的指针接收器的指针类型:

<code class="go">func Foo[T any, PT interface { SetId(string); *T}](v T) {}</code>
登录后复制

修复实现约束

您可能遇到的另一个错误是:

A 没有实现 GS(SetId 方法有指针接收器)

此错误表明 SetId 方法是在 *A 上声明的,而不是在 A 上声明的。要修复此问题,请使用 *A 而不是实例化 MyStore A 并相应地调整结构体字段和方法的类型:

<code class="go">var storeA = &MyStore[*A]{}

type MyStore[T GS] struct {
    values map[string]T
}

func (s *MyStore[T]) add(item T) {
}</code>
登录后复制

结论

在 Go 中使用泛型时,理解这些类型参数注意事项和实现约束至关重要。通过解决这些问题,您可以有效地使用泛型来实现可重用和可维护的代码。

以上是为什么 Go 泛型会抛出'item.SetId undefined”错误以及如何修复它们?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板