Go语言报错‘type does not satisfy interface (method has pointer receiver)’求助
Go泛型接口与指针接收器不匹配问题的解决方法
你的代码报错核心原因是:hello类型的read()方法使用了指针接收器,因此只有*hello类型实现了reader接口,而hello本身并没有实现该接口。泛型函数set[T reader]要求类型参数T必须满足reader约束,但调用时传入&i(i是hello类型)会让编译器推断T为hello,自然不符合约束条件。
下面提供三种可行的解决方式:
方式一:调整泛型约束,要求指针类型实现接口
修改泛型函数的约束,明确指定*T需要实现reader接口,这样T可以是任意类型,只要它的指针满足接口要求:
package main type reader interface { read() } type hello int func (*hello) read() {} // 约束改为:*T 必须实现 reader 接口 func set[T any](a *T) where *T reader { var b T *a = b } func main() { i := hello(1) set(&i) }
方式二:将方法接收器改为值类型
如果业务逻辑允许,把read()的接收器从指针改为值类型,这样hello类型本身就实现了reader接口,泛型约束可以直接生效:
package main type reader interface { read() } type hello int // 值接收器,hello类型直接实现reader接口 func (hello) read() {} func set[T reader](a *T) { var b T *a = b } func main() { i := hello(1) set(&i) }
方式三:显式指定泛型类型参数并使用指针变量
保持原方法的指针接收器不变,在调用set时显式指定类型参数为*hello,同时将变量声明为指针类型:
package main type reader interface { read() } type hello int func (*hello) read() {} func set[T reader](a *T) { var b T *a = b } func main() { i := &hello(1) // 声明为*hello类型的变量 set[*hello](i) // 显式指定类型参数 }
内容的提问来源于stack exchange,提问作者Zombo
相关产品推荐
相关产品推荐

