在 Go 中使用泛型时,区分类型参数及其约束至关重要。类型参数用大写字母表示,例如 T,而约束是定义类型参数所需行为的接口类型。例如:
<code class="go">type GS interface { Id() string SetId(string) }</code>
在这种情况下,GS 是约束,它指定实现 GS 的类型必须具有具有特定签名的 Id() 和 SetId() 方法。
在泛型中使用 T 等类型参数时,必须了解 *T 与 T 不同。*T 表示指向类型参数 T 的指针。
在您的示例中,遇到的错误是:
type *T is pointer to type parameter, not type parameter
尝试在类型参数(T 上使用指针方法(本例中为 SetId() )时会发生此错误)。但是,指针方法仅适用于指向类型参数 (*T) 的指针,而不适用于类型参数本身。
要解决此问题,您需要显式指定对类型参数的指针的约束。这可以通过添加额外的约束来完成:
<code class="go">type GS interface { Id() string SetId(string) } type PT interface { *GS }</code>
现在您可以使用 PT 作为 MyStore 上的约束:
<code class="go">type MyStore[T PT] struct { values map[string]T }</code>
将 MyStore 中 *T 的出现次数更改为 T结构体和方法定义也是必要的。
错误消息还表明类型 A 没有实现 GS 接口,因为 A 中的 SetId() 方法有一个指针接收器。要解决此问题,您需要确保 A 类型正确实现 GS 接口:
<code class="go">func (a *A) SetId(id string) { a.ID = id }</code>
通过这些修改,代码应该可以成功编译。
以上是为什么在 Go 中使用泛型时会出现'Type *T 是指向类型参数的指针,而不是类型参数”?的详细内容。更多信息请关注PHP中文网其他相关文章!