如何使用kelseyhightower/envconfig声明结构的默认值?

How to declare a default value for a struct with kelseyhightower/envconfig?

提问人:Marc Le Bihan 提问时间:11/15/2023 最后编辑:Marc Le Bihan 更新时间:11/16/2023 访问量:47

问:

一开始,一切都很顺利。

我有一个配置可以在包的帮助下读取driversgithub.com/kelseyhightower/envconfig

type NXConfig struct {
    Enable bool `default:"true"`
    NxRate time.Duration `default:"300ms"`
    NxDisconnectingChance int `default:"8"`
    NxDisconnectionDuration time.Duration `default:"25s"`
}

var nxConfig NXConfig
envconfig.Process("NX", &nxConfig)

conf = &Config{
    NxConfig: &nxConfig,
}

在开发/测试模式下,默认评估允许结构成员准备好使用 、 、 进行测试。true300ms825ms


但是我的配置现在也依赖于生成的类型。
我无法输入此类型以将默认值放在其变量成员的前面,因为它是生成的类型:它是共享的,没有任何意义。 但是,我需要它使用默认值进行初始化。
Item

我首先尝试了:

type NXConfig struct {
    Enable bool `default:"true"`
    Item nx.ActivationData {IpAddress: "127.0.0.1", PortNumber: 3000, ItemId: "99", ItemType: "990"}
    NxRate time.Duration `default:"300ms"`
    NxDisconnectingChance int `default:"8"`
    NxDisconnectionDuration time.Duration `default:"25s"`
}

但保留其成员的 或 0。nx.ActivationDatanil

我尝试了第二个:

type NXConfig struct {
    Enable bool
    Item nx.ActivationData
    NxRate time.Duration
    NxDisconnectingChance int
    NxDisconnectionDuration time.Duration
}

删除 中的默认值,并创建构造函数:struct

func NewNXConfig() *NXSimulatorConfig {
    return &NXConfig{   Enable: true,
        Item: nx.ActivationData {IpAddress: "127.0.0.1", PortNumber: 3000, ItemId: "99", ItemType: "990"},
        NxRate: time.Duration(time.Millisecond) * time.Duration(300),
        NxDisconnectingChance: 8,
        NxDisconnectionDuration:  time.Duration(time.Millisecond) * time.Duration(25)}
}

我把最后几行改成了:

var nxConfig *NXConfig = NewNXConfig()
envconfig.Process("NX", nxConfig)

conf = &Config{
    NxConfig: nxConfig,
}

成功了。但这是一条漫长的道路......

如何声明子成员的默认值,从其外部,用?structdefault

我应该如何在我的父结构中编写

声明,使其分配其成员?
Item nx.ActivationData {IpAddress: "127.0.0.1", PortNumber: 3000, ItemId: "99", ItemType: "990"}

go struct 构造函数 default-value

评论


答:

0赞 Pim 11/16/2023 #1

实现配置的最简单方法是为 和 的配置添加一个结构,然后从所述配置构建。作为奖励,您的配置现在也在其预期值中显式,而不是嵌入生成的结构。nx.ActivationItemnx.ActivationItem

type NXConfig struct {
    Enable                  bool `default:"true"`
    Item                    NXActivationData
    NxRate                  time.Duration `default:"300ms"`
    NxDisconnectingChance   int           `default:"8"`
    NxDisconnectionDuration time.Duration `default:"25s"`
}

type NXActivationData struct {
    IpAddress  string `default:"127.0.0.1"`
    PortNumber int    `default:"3000"`
    ItemId     string `default:"99"`
    ItemType   string `default:"990"`
}

func (cfg *NXActivationData) build() nx.ActivationData {
    return nx.ActivationData{
        IpAddress:  cfg.IpAddress,
        PortNumber: cfg.PortNumber,
        ItemId:     cfg.ItemId,
        ItemType:   cfg.ItemType,
    }
}

评论

0赞 Marc Le Bihan 11/16/2023
这将创建两个具有相同成员的成员。生成的一个(来自给定的 jsonschema,并由 生成)将占上风:它是官方引用。structquicktype