亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何使用結構迭代yml部分?

如何使用結構迭代yml部分?

Go
侃侃無極 2022-09-12 20:49:48
我用毒蛇。我正在嘗試從具有yml配置的結構中獲取信息。type Config struct {    Account       User           `mapstructure:"user"`      }type User struct {    Name       string           `mapstructure:"name"`    Contacts   []Contact        `mapstructure:"contact"`}type Contact struct {    Type          string          `mapstructure:"type"`    Value         string          `mapstructure:"value"`}func Init() *Config {    conf := new(Config)    viper.SetConfigType("yaml")    viper.ReadInConfig()    ...    viper.Unmarshal(conf)    return conf}...config := Init()...for _, contact := range config.Account.Contacts {   type := contact.type   vlaue := contact.value}和配置user:  name: John  contacts:    email:      type: email      value: [email protected]    skype:      type: skype      value: skypeacc我可以獲得這樣的結構項目嗎?我無法獲得這樣的聯系人數據??赡軉??
查看完整描述

2 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

我認為唯一重要的問題是,在數據結構中,您已經聲明為列表,但在YAML文件中,它是一個字典。如果像這樣構建輸入文件:Contacts


user:

  name: John

  contacts:

    - type: email

      value: [email protected]

    - type: skype

      value: skypeacc

然后你可以像這樣閱讀它:


package main


import (

    "fmt"


    "github.com/spf13/viper"

)


type Config struct {

    User User

}


type User struct {

    Name     string

    Contacts []Contact

}


type Contact struct {

    Type  string

    Value string

}


func main() {

    var cfg Config


    viper.SetConfigName("config")

    viper.AddConfigPath(".")

    err := viper.ReadInConfig()

    if err != nil {

        panic(err)

    }

    viper.Unmarshal(&cfg)

    fmt.Println("user: ", cfg.User.Name)

    for _, contact := range cfg.User.Contacts {

        fmt.Println("  ", contact.Type, ": ", contact.Value)

    }

}

上面的代碼可以按原樣運行;您應該能夠將其放入文件中并構建它。當我運行上面的示例時,我得到作為輸出:


user:  John

   email :  [email protected]

   skype :  skypeacc


查看完整回答
反對 回復 2022-09-12
?
青春有我

TA貢獻1784條經驗 獲得超8個贊

如果我得到你想要實現的目標是正確的,并且基于你提供的循環;for


您實際需要的是一個 YAML 序列,它是一個數組。所以你的最終YAML文件應該看起來像;

user:

  name: John

  contacts:

      - type: email

        value: [email protected]

      - type: skype

        value: skypeacc

      - type: email

        value: [email protected]

此外,切片上的標簽中有拼寫錯誤。它應該與 YAML 密鑰匹配;Contacts

type User struct {

   Name     string    `mapstructure:"name"`

   Contacts []Contact `mapstructure:"contacts"`

}

如果您希望保留原始的 YAML 文件結構,則必須為每個 YAML 鍵提供一個標記(和相應的結構字段),因此不可能開箱即用地循環它,因為 并且 被解析為結構字段。原始 YAML 文件的結構示例如下:emailskype


type Config struct {

    Account User `mapstructure:"user"`

}


type User struct {

    Name     string   `mapstructure:"name"`

    Contacts Contacts `mapstructure:"contacts"`

}


type Contacts struct {

    Email Contact `mapstructure:"email"`

    Skype Contact `mapstructure:"skype"`

}


type Contact struct {

    Type  string `mapstructure:"type"`

    Value string `mapstructure:"value"`

}


查看完整回答
反對 回復 2022-09-12
  • 2 回答
  • 0 關注
  • 104 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號