2 回答

TA贡献1816条经验 获得超4个赞
这就是我最终得到的结果,它允许我根据 toml 文件中指定的内容有条件地加载结构,并且仍然使用接口将其视为结构不可知论。
如果有人有任何关于将其重构为更惯用的技巧,请告诉我!
type ProviderService interface {
DoAThing()
}
type Alpha struct {
Apikey string `mapstructure:"apikey"`
Domain string `mapstructure:"domain"`
}
type Beta struct {
Username string `mapstructure:"username"`
Password string `mapstructure:"password"`
Domain string `mapstructure:"domain"`
}
func main() {
provider := loadConfig()
if provider == nil {
log.Fatal("unable to parse config file")
}
provider.DoAThing()
}
func (a Alpha) DoAThing() {
fmt.Println("domain", a.Domain)
}
func (b Beta) DoAThing() {
fmt.Println("domain", b.Domain)
}
func loadConfig() ProviderService {
viper.AddConfigPath("./")
viper.SetConfigName("config")
viper.SetConfigType("toml")
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("Fatal error config file: %w \n", err))
}
var a Alpha
_ = viper.UnmarshalKey("alpha", &a)
if a != (Alpha{}) {
return a
}
var b Beta
_ = viper.UnmarshalKey("beta", &b)
if b != (Beta{}) {
return b
}
return nil
}
- 2 回答
- 0 关注
- 135 浏览
添加回答
举报