首页  >  文章  >  后端开发  >  为什么Go在使用泛型时会抛出错误“type *T ispointer to typeparameter, not typeparameter”?

为什么Go在使用泛型时会抛出错误“type *T ispointer to typeparameter, not typeparameter”?

Susan Sarandon
Susan Sarandon原创
2024-11-04 16:46:02167浏览

Why Does Go Throw the Error

使用泛型:了解类型参数和约束

本文深入探讨了为什么编译器错误“type *T is point to type argument, not type”的复杂性尝试在 Go 中编译涉及泛型的代码时会出现“参数”。

关于类型参数和约束

在 Go 泛型中,类型参数表示满足指定约束的任何类型的占位符。值得注意的是,该约束定义了类型参数上可用的操作集,但它并不直接定义从该类型参数派生的任何指针类型的属性。这是遇到的错误消息的关键。

错误消息解释

错误消息表示 *T 的方法集不会自动包含在具体类型上声明的指针接收器方法受限制。这意味着,如果约束接口需要指针接收器方法,则具体类型必须使用指针接收器来实现它。

解决问题

在提供的代码片段中:

  1. 约束:要解决“SetId 方法有指针接收器”错误,接口 GS 应使用指针接收器定义:
<code class="go">type GS interface {
    Id() string
    (*GS) SetId(string)
}</code>
  1. 实例化: MyStore 实例化应使用 *A 而不是 A:
<code class="go">var storeA = &MyStore[*A]{}</code>
  1. 方法修改: 将 MyStore 中的方法定义更改为使用 T 代替 *T:
<code class="go">type MyStore[T GS] struct {
    values map[string]T
}

func (s *MyStore[T]) add(item T) {...}</code>

通过进行这些调整,代码在语法和语义上变得正确。

以上是为什么Go在使用泛型时会抛出错误“type *T ispointer to typeparameter, not typeparameter”?的详细内容。更多信息请关注PHP中文网其他相关文章!

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