首页 >后端开发 >Golang >为什么在 Go 中使用泛型时会出现'Type *T 是指向类型参数的指针,而不是类型参数”?

为什么在 Go 中使用泛型时会出现'Type *T 是指向类型参数的指针,而不是类型参数”?

Patricia Arquette
Patricia Arquette原创
2024-11-05 12:53:02758浏览

Why Do I Get

使用泛型:类型 *T 是指向类型参数的指针,而不是类型参数

理解类型参数和约束

在 Go 中使用泛型时,区分类型参数及其约束至关重要。类型参数用大写字母表示,例如 T,而约束是定义类型参数所需行为的接口类型。例如:

<code class="go">type GS interface {
    Id() string
    SetId(string)
}</code>

在这种情况下,GS 是约束,它指定实现 GS 的类型必须具有具有特定签名的 Id() 和 SetId() 方法。

类型 * T 与类型参数

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

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