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

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.

Vol*_*ker 6

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

你根本不能那样做。

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