我想要一个接口,它可以将任何类型的参数传递给它的单个方法,并且我想要一个带有泛型的单个实现结构。
这是我的问题的超级简化版本:
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]()
}
我引用了两页
[1] Go错误:无法使用泛型不实例化的类型
[2] 如何实现通用接口?