Go语言 如何用kelseyhightower/envconfig声明一个结构的默认值?

xiozqbni  于 5个月前  发布在  Go
关注(0)|答案(1)|浏览(60)

刚开始的时候,一切都很顺利。
我有一个配置要在github.com/kelseyhightower/envconfig包的帮助下从drivers读取

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"`
}


nx.ActivationData与其具有nil或0的成员保持一致。
我试过第二次:

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,
}


成功了。但这是一条漫长的路...
如何声明一个struct的子成员的默认值,从同它的外部,同default
我该怎么写
Item nx.ActivationData {IpAddress: "127.0.0.1", PortNumber: 3000, ItemId: "99", ItemType: "990"}
声明,使其分配其成员?

nkhmeac6

nkhmeac61#

实现配置的最简单方法是为nx.ActivationItem的配置添加一个结构体,然后从该配置构建nx.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,
    }
}

字符串

相关问题