You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何动态创建结构体并作为泛型参数解决DI实例覆盖问题

问题描述

以下是可运行的示例代码:

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
    }

但这种方式无法在循环中使用。

考虑动态创建与原myStruct完全一致的唯一结构体类型,使DI容器中每个实例对应唯一类型,避免"只能存在一个"的冲突问题。

希望能提供反射实现方案,以避免重复编写AddMyStruct逻辑。

内容的提问来源于stack exchange,提问作者Herb Stahl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:13:17