第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有條件地將毒蛇配置(toml)解組為結(jié)構(gòu)的慣用方法

有條件地將毒蛇配置(toml)解組為結(jié)構(gòu)的慣用方法

Go
皈依舞 2022-10-31 15:52:14
我是 Go 新手,想知道如何以慣用的方式解決以下問題:我正在使用 viper 將配置文件加載到程序中。我選擇 toml 格式是因為我想要一個配置文件,它可以指定幾種不同格式的所需輸入:例如,Alpha 提供程序需要一個 apikey,而 Beta 提供程序需要用戶名和密碼。[alpha]apikey = "123"domain = "example.com"# [beta]# username = ""# password = ""# domain = ""type ProviderService interface {                                     PrintDomain()                                                }                                                                                                                                 type Provider struct {                                               Alpha `mapstructure:"alpha"`                                     Beta  `mapstructure:"beta"`                                                     }                                                                                                                                 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"`                      }                                                                上面的代碼導(dǎo)致{Alpha:{Apikey:123 Domain:example.com} Beta:{Username: Password: Domain:}}空/未使用的結(jié)構(gòu)仍然存在。最終,我希望 ProviderService 接口與提供者無關(guān),因此我可以簡單地調(diào)用provider.PrintDomain()而不是provider.Alpha.PrintDomain()讓代碼中散布著 if/else 語句。我也對構(gòu)建代碼以實現(xiàn)這一結(jié)果的其他方式持開放態(tài)度。提前致謝!
查看完整描述

2 回答

?
侃侃爾雅

TA貢獻(xiàn)1801條經(jīng)驗 獲得超16個贊

一種可能的方法是使用反射

func main() {
    provider := loadConfig()
    fmt.Printf("%+v\n", provider)
    v := reflect.ValueOf(provider)
    for i := 0; i < v.NumField(); i++ {
        field := v.Field(i)
        fmt.Println("domain:", field.FieldByName("Domain"))
    }}

它將打印 Alpha 或 Beta 結(jié)構(gòu)的“域”字段。

去游樂場


查看完整回答
反對 回復(fù) 2022-10-31
?
繁華開滿天機(jī)

TA貢獻(xiàn)1816條經(jīng)驗 獲得超4個贊

這就是我最終得到的結(jié)果,它允許我根據(jù) toml 文件中指定的內(nèi)容有條件地加載結(jié)構(gòu),并且仍然使用接口將其視為結(jié)構(gòu)不可知論。


如果有人有任何關(guān)于將其重構(gòu)為更慣用的技巧,請告訴我!


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

}


查看完整回答
反對 回復(fù) 2022-10-31
  • 2 回答
  • 0 關(guān)注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號