提问人:Marc Le Bihan 提问时间:11/15/2023 最后编辑:Marc Le Bihan 更新时间:11/16/2023 访问量:47
如何使用kelseyhightower/envconfig声明结构的默认值?
How to declare a default value for a struct with kelseyhightower/envconfig?
问:
一开始,一切都很顺利。
我有一个配置可以在包的帮助下读取drivers
github.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,
}
在开发/测试模式下,默认评估允许结构成员准备好使用 、 、 进行测试。true
300ms
8
25ms
但是我的配置现在也依赖于生成的类型。
我无法输入此类型以将默认值放在其变量成员的前面,因为它是生成的类型:它是共享的,没有任何意义。
但是,我需要它使用默认值进行初始化。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.ActivationData
nil
我尝试了第二个:
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"}
答:
0赞
Pim
11/16/2023
#1
实现配置的最简单方法是为 和 的配置添加一个结构,然后从所述配置构建。作为奖励,您的配置现在也在其预期值中显式,而不是嵌入生成的结构。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,
}
}
评论
0赞
Marc Le Bihan
11/16/2023
这将创建两个具有相同成员的成员。生成的一个(来自给定的 jsonschema,并由 生成)将占上风:它是官方引用。struct
quicktype
评论