我正在学习 Go 1.18 泛型,我试图理解为什么我在这里遇到麻烦。长话短说,我正在尝试Unmarshal一个 protobuf,我希望参数类型blah“正常工作”。我已经尽可能地简化了问题,并且这个特定的代码正在重现我看到的相同错误消息:
./prog.go:31:5: cannot use t (variable of type *T) as type stringer in argument to do:
*T does not implement stringer (type *T is pointer to type parameter, not type parameter)
package main
import "fmt"
type stringer interface {
a() string
}
type foo struct{}
func (f *foo) a() string {
return "foo"
}
type bar struct{}
func (b *bar) a() string {
return "bar"
}
type FooBar interface {
foo | bar
}
func do(s stringer) {
fmt.Println(s.a())
}
func blah[T FooBar]() {
t := &T{}
do(t)
}
func main() {
blah[foo]()
}
我意识到我可以通过不使用泛型(即,将实例传递给 )来完全简化此示例blah(s stringer) {do(s)}。但是,我确实想了解为什么会发生错误。
我需要用这段代码更改什么,以便我可以创建一个实例T并将该指针传递给一个需要特定方法签名的函数?
偶然的你