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

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"`
}
- 2 回答
- 0 關注
- 104 瀏覽
添加回答
舉報