Go 领域在编程中,使用泛型时了解类型参数的性质及其约束至关重要。一个常见的陷阱在于混淆类型参数本身及其约束。
考虑使用共享 ID 字段为类型 A 和 B 实现对象存储的示例。为了遵循 DRY 原则,开发人员使用泛型来创建一个具有代表常见操作的 GS 接口的商店。但是,当尝试使用 GS 接口添加对象并设置其 ID 字段时,编译器会引发错误:
item.SetId undefined (type *T is pointer to type parameter, not type parameter) A does not implement GS (SetId method has pointer receiver)
解码此错误消息可以得出基本的理解:类型参数与其类型参数不同约束。该约束建立了 T 上允许的操作,但没有对 T(指向 T 的指针)施加任何要求。因此,T 的方法集不会继承在具体类型 A 上声明的指针接收器方法,也不会隐式实现适用于 *A 的接口。
解决此问题涉及显式定义附加约束,如以下示例所示:
func Foo[T any, PT interface { SetId(string); *T}](v T) {}
为了解决错误的第二部分,涉及约束的实现,需要注意的是 MyStore 应该使用 A 实例化以满足约束SetId() 是在 A 上定义的,而不是 A。随后,调整结构体字段的类型和方法签名以反映此更改将允许所需的行为。
总而言之,有效地处理“ *T 是指向类型参数的指针,而不是类型参数”错误需要明确区分类型参数及其约束。这可确保显式声明和实现约束,从而防止意外的编译器错误。
以上是为什么 Go 使用泛型时会抛出'*T 是指向类型参数的指针,而不是类型参数”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!