我想要一个接口,它可以将任何类型的参数传递给它的单个方法,并且我想要一个带有泛型的单个实现结构。
这是我的问题的超级简化版本:
package main type MyInterface interface { Set(val any) } type MyStruct[T any] struct { val T } func NewMyStruct[T any]() *MyStruct[T] { return &MyStruct[T]{} } func (s *MyStruct[T]) Set(val T) { s.val = val } func main() { var obj MyInterface obj = NewMyStruct[any]() // accepted obj = NewMyStruct[int]() // not accepted obj = NewMyStruct[string]() // not accepted }
有没有一种方法可以满足编译器的要求,并且在直接处理结构体时不会丢失 Set 方法的类型信息?
我认为你的代码可以这样修改
package main import "fmt" type MyInterface[T any] interface { Set(value T) } type MyStruct[T any] struct { val T } func NewMyStruct[T any]() *MyStruct[T] { return &MyStruct[T]{} } func (s *MyStruct[T]) Set(val T) { s.val = val } func main() { var obj1 MyInterface[int] obj1 = NewMyStruct[int]() var obj2 MyInterface[string] obj2 = NewMyStruct[string]() var obj3 MyInterface[any] obj3 = NewMyStruct[any]() }
每当使用参数化类型时,都必须将其定义中的类型参数替换为实际类型。这意味着必须实例化接口中的泛型类型。为此,您的接口应该这样声明。
// As-is type MyInterface interface { Set(val any) } // To-be type MyInterface[T any] interface { Set(val T) }
并且在使用它时,您应该明确该 any
使用的是什么类型。
func main() { var obj1 MyInterface[int] obj1 = NewMyStruct[int]() }
我引用了两页
[2] 如何实现通用接口?
以上是在 Go 中使用泛型类型结构实现接口方法的详细内容。更多信息请关注PHP中文网其他相关文章!