Her*_*ahl -3 generics reflection go
这是一个可以开始的工作示例:
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
})
}
Run Code Online (Sandbox Code Playgroud)
我正在使用的 DI 库期望在此片段中传递“obj”;
AddSingleton[IMyStruct](b, func(obj *myStruct) IMyStruct {
return obj
})
Run Code Online (Sandbox Code Playgroud)
是一种独特的类型。它在第一步中被添加到 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
}
Run Code Online (Sandbox Code Playgroud)
但当我想在 for 循环中添加这些对象时,这不起作用。
我在想,如果我动态创建类型,成为原始 myStruct 的完美克隆,那么添加到 di 的所有内容都是唯一类型。因此解决“只能有一个”没有问题。
我希望有人有反射印章,我不必复制AddMyStruct.