Я начал отвечать на ваш первоначальный вопрос, но он настолько громоздок и, вероятно, не тот, который вы действительно хотите.
Ваш код после вставки содержит кучу ошибок, поэтому вместо этого позвольте мне предложить более простое решение, о котором я говорил в своем комментарии.
package main
import (
"log"
"github.com/spf13/viper"
)
type Config struct {
Database Database `mapstructure:"database"`
Customers map[string]Company `mapstructure:"customers"`
}
type Database struct {
Host string `mapstructure:"host"`
Port uint16 `mapstructure:"port"`
User string `mapstructure:"user"`
Pass string `mapstructure:"pass"`
Db string `mapstructure:"db"`
}
type Company struct {
Address string `mapstructure:"address"`
Contacts []Contact `mapstructure:"contacts"`
}
type Contact struct {
Name string `mapstructure:"name"`
Email string `mapstructure:"email"`
}
func main() {
viper.SetConfigName("config")
viper.AddConfigPath(".")
if err := viper.ReadInConfig(); err != nil {
log.Fatal("Unable to read config file", err)
}
var conf Config
err := viper.Unmarshal(&conf)
if err != nil {
panic(err)
}
log.Printf("%#v", conf)
}
Если вы запустите этот код с вашим файлом конфигурации JSON (с именем config
), он вернет следующий вывод:
2018/04/28 14:47:54
main.Config {База данных: main.Database {Хост: "localhost", Порт: 0xcea,
Пользователь: "username", Pass: "mypassword", Db: "mydb"},
Клиенты: карта [строка] main.Company { "company_two": main.Company {Адрес: "Irish
Town Pl, Гибралтар GX11 1AA, Гибралтар ",
Контакты: [] main.Contact {main.Contact {Имя: "Lucky Luke",
Электронная почта: "lucky.luke@second-company.local"}}},
"company_one": main.Company {Адрес: "66 Great Queen St, London WC2B
5BX, UK ", Контакты: [] main.Contact {main.Contact {Имя:" Джо Доу ",
Электронная почта: "joe.doe@company-one.local"}, main.Contact {Имя: "Джейн Доу",
Электронная почта: "jane.doe@company-one.local"}}}}}
И здесь это переформатируется так, как было бы написано, если бы вы создавали всю эту структуру в коде:
Config{
Database{
Host: "localhost",
Port: 0xcea,
User: "username",
Pass: "mypassword",
Db: "mydb"},
Customers: map[string]Company{
"company_two": Company{Address: "Irish Town Pl, Gibraltar GX11 1AA, Gibraltar",
Contacts: []Contact{
Contact{Name: "Lucky Luke", Email: "lucky.luke@second-company.local"}}},
"company_one": Company{Address: "66 Great Queen St, London WC2B 5BX, UK",
Contacts: []Contact{
Contact{Name: "Joe Doe", Email: "joe.doe@company-one.local"},
Contact{Name: "Jane Doe", Email: "jane.doe@company-one.local"}}},
},
}