下面是一个工作示例:
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
。
如何动态创建一个结构体,然后将其用作泛型的类型参数
你根本不能那样做。
(但我必须承认我不懂你的代码。)