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