Неправильная структура возвращена из отдельной функции пакета - PullRequest
0 голосов
/ 26 февраля 2020

Я разрабатываю приложение на своей Ubuntu 18.04 с go.

У меня есть пакет конфигурации. Идея состоит в том, чтобы использовать этот пакет в других пакетах для получения конфигураций. Конфигурация пакета имеет переменную структуры _Config. Идея, что функция GetConfig вернет _Config, а когда _Config не заполнена, функция сначала заполнит _Config из json файла.

Пакет конфигурации выглядит следующим образом:

package config

import (
    "fmt"
    "github.com/tkanos/gonfig"
)

type Config struct {
    DB struct{
        DBHost string
        DBPort uint
        DBUser string
        DBPassword string
        DBName string
    }
}

var _Config Config

func GetConfig() Config {
    if (Config{}) == _Config {
        _Config := Config{}
        err := gonfig.GetConf("/home/mike/go/src/project/config.json", &_Config)
        if err != nil{
            panic("Error when parsing config")
        }
        fmt.Println(_Config.DB)
    }
    return _Config
}

И результат Println:

{127.0.0.1 3306 user Password project}

Код основного пакета выглядит так:

основной пакет

import (
    "fmt"
    "project/config"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    _ "project/config"
    "syscall"
    "unsafe"
)

func main() {
    _config := config.GetConfig()
    fmt.Println(_config)
}

И результат Println:

{{ 0   }}

Файл json выглядит следующим образом:

{
  "DB": {
    "DBHost": "127.0.0.1",
    "DBPort": 3306,
    "DBUser": "user",
    "DBPassword": "Password",
    "DBName": "project"
  }
}

Так почему же это так? Почему я не могу получить правильный конфиг в основном пакете? Проблема Я думаю, что у меня неправильное представление о том, как Go работает в такой ситуации.

Пожалуйста, уточните этот момент для меня, и это хороший подход для конфигурации в приложении? Если нет, что такое хороший шаблон? Идея состоит в том, чтобы иметь один доступ и один ответственный пакет для конфигурации, который я могу использовать везде

1 Ответ

3 голосов
/ 26 февраля 2020

У вас есть строка в функции GetConfig() - _Config := Config{}.

Здесь вы объявляете новую переменную _Config в локальной области действия и затемняете глобальную переменную. Удалите эту строку и попробуйте снова. Из-за затенения глобальная переменная не заполняется конфигурацией из json.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...