2 回答

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊
我認(rèn)為唯一重要的問(wèn)題是,在數(shù)據(jù)結(jié)構(gòu)中,您已經(jīng)聲明為列表,但在YAML文件中,它是一個(gè)字典。如果像這樣構(gòu)建輸入文件:Contacts
user:
name: John
contacts:
- type: email
value: test@test.com
- 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)
}
}
上面的代碼可以按原樣運(yùn)行;您應(yīng)該能夠?qū)⑵浞湃胛募胁?gòu)建它。當(dāng)我運(yùn)行上面的示例時(shí),我得到作為輸出:
user: John
email : test@test.com
skype : skypeacc

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果我得到你想要實(shí)現(xiàn)的目標(biāo)是正確的,并且基于你提供的循環(huán);for
您實(shí)際需要的是一個(gè) YAML 序列,它是一個(gè)數(shù)組。所以你的最終YAML文件應(yīng)該看起來(lái)像;
user:
name: John
contacts:
- type: email
value: test@test.com
- type: skype
value: skypeacc
- type: email
value: joe@example.com
此外,切片上的標(biāo)簽中有拼寫(xiě)錯(cuò)誤。它應(yīng)該與 YAML 密鑰匹配;Contacts
type User struct {
Name string `mapstructure:"name"`
Contacts []Contact `mapstructure:"contacts"`
}
如果您希望保留原始的 YAML 文件結(jié)構(gòu),則必須為每個(gè) YAML 鍵提供一個(gè)標(biāo)記(和相應(yīng)的結(jié)構(gòu)字段),因此不可能開(kāi)箱即用地循環(huán)它,因?yàn)?并且 被解析為結(jié)構(gòu)字段。原始 YAML 文件的結(jié)構(gòu)示例如下: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"`
}
- 2 回答
- 0 關(guān)注
- 108 瀏覽
添加回答
舉報(bào)