如何动态创建结构体并将其用作泛型函数的类型参数



下面是一个工作示例:

package main
type (
builder    struct{}
ISomething interface {
DoSomething()
}
IMyStruct interface {
MySomething()
}
myStruct struct {
Num       int
Something ISomething
}
Something struct{}
)
func AddSingleton[T any](b *builder, ctor any) {}
func (m *myStruct) MySomething()  {}
func (s *Something) DoSomething() {}
func main() {
var something ISomething = &Something{}
b := &builder{}
for i := 0; i < 2; i++ {
AddMyStruct(b, something, i)
}
}
func AddMyStruct(b *builder, something ISomething, num int) {
AddSingleton[*myStruct](b, func(something ISomething) *myStruct {
return &myStruct{Num: num, Something: something}
})
AddSingleton[IMyStruct](b, func(obj *myStruct) IMyStruct {
return obj
})
}

我正在使用的DI库期望"obj">

AddSingleton[IMyStruct](b, func(obj *myStruct) IMyStruct {
return obj
})

是唯一类型。它在第一步中被添加到DI中,然后当有人想要使用IMyStruct获得相同的实例时,它只解析添加的最后一个类型。
在我的for循环中,2被添加,它总是解析最后一个。我可以向容器请求[]IMyStruct的数组,这确实给了我2个,但它们是最后添加的*myStruct。即objs[0].Num == 1,objs[1].Num == 1。应该是0,1

我可以使用泛型添加唯一性;

type myStruct[T any] struct {
Num       int
Something ISomething
}

但是当我想在for循环中添加这些对象时,这不起作用

我在想,如果我动态地创建类型,作为原始myStruct的完美克隆,那么添加到di中的所有内容都是唯一类型。因此解决它没有问题,"只能有一个"。

我希望有人有反射印章,我不需要复制AddMyStruct

如何动态创建一个结构体,然后将其用作泛型的类型参数

你根本不能那样做。

(但我必须承认我不懂你的代码。)

相关内容

  • 没有找到相关文章

最新更新