为什么在 Go 中使用泛型时会出现'Type *T 是指向类型参数的指针,而不是类型参数”?
使用泛型:类型 *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

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前
By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
击败分裂小说需要多长时间?
3 周前
By DDD
R.E.P.O.保存文件位置:在哪里以及如何保护它?
3 周前
By DDD

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)