Динамические имена групп с гадюкой - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь получить некоторые группы из конфига, имена которых неизвестны (подробнее узнаем позже).

Я новичок в Голанге и немного борюсь. Я использую Viper, потому что он поддерживает yaml, json и toml.

json config:

{
    "database": {
        "db": "mydb",
        "host": "localhost",
        "pass": "mypassword",
        "port": 3306,
        "user": "username"
    },
    "customers": {
        "company_one": {
            "address": "66 Great Queen St, London WC2B 5BX, UK",
            "contacts": [
                {
                    "email": "joe.doe@company-one.local",
                    "name": "Joe Doe"
                },
                {
                    "email": "jane.doe@company-one.local",
                    "name": "Jane Doe"
                }
            ]
        },
        "company_two": {
            "address": "Irish Town Pl, Gibraltar GX11 1AA, Gibraltar",
            "contacts": [
                {
                    "email": "lucky.luke@second-company.local",
                    "name": "Lucky Luke"
                }
            ]
        }
    }
}

и источник:

package main

import (
    "fmt"
    "log"
    "github.com/spf13/viper"
)

type Config struct {
    database Database
    customers Customer
}

type Database struct {
    host string
    port uint16
    user string
    pass string
    db string
}

type Customer struct {
    company Company
}

type Company struct {
    contacts Contact
    address string
}

type Contact struct {
    name string
    email string
}

func main() {
    viper.SetConfigName("a")
    viper.AddConfigPath(".")
    if err := viper.ReadInConfig(); err != nil {
        log.Fatal("Unable to read config file", err)
    }
    var conf Config
    database := viper.GetStringMap("database")
    for key, i := range database {
        switch key {
        case "host":
            conf.database.host = i.(string)
        case "port":
            conf.database.port = i.(uint16)
        case "user":
            conf.database.user = i.(string)
        case "pass":
            conf.database.pass = i.(string)
        case "db":
            conf.database.db = i.(string)
        }
    }
    fmt.Printf("%v\n", conf)
}

Понятия не имею, как перебирать клиентов.

Я уже пробовал этот (преобразованный из go-toml в viper), но он не сработал, как ожидалось:

var contMap = map[string]Contacts

cust := config.Get("customers")

for _, c := range cust.Keys() {
    sub := cust.Get(c).([]interface{})
    for _,d := range sub{
        address := d.([]interface{})[0].(string)
        hostMap[host] = Contacts{
            email: email,
            name: name,
        }
    }
    log.Printf("Customers: %s contact: %q", c, sub)
}

1 Ответ

0 голосов
/ 28 апреля 2018

Я начал отвечать на ваш первоначальный вопрос, но он настолько громоздок и, вероятно, не тот, который вы действительно хотите.

Ваш код после вставки содержит кучу ошибок, поэтому вместо этого позвольте мне предложить более простое решение, о котором я говорил в своем комментарии.

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"}}},
    },
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...