Использовать разные структуры базы данных в структуре глобальной конфигурации

#go

#Вперед

Вопрос:

У меня есть глобальная конфигурация для большинства настроек (например, файлов журнала), которые я использую во всех проектах, например:

 project config

type Config struct {
    Logfile string
    Loglevel string
    Database *database.Database
}
  

Сама конфигурация имеет свой собственный проект, база данных имеет свои собственные проекты, и реализация выполняется в ее собственном проекте. (Итак, у меня есть проект конфигурации, проект базы данных и проект приложения).

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

 project database

// This interface is referenced by the Config struct using *database.Database
type Database interface {
    InitDatabase() error
}

type AppDatabase interface {
    InitDatabase() error // To satisfy the Database interface
    AdditionalFunction1() 
    AdditionalFunction2()
}

type OtherAppDatabase interface {
    InitDatabase() error
    OtherFunc1() 
}
  

Когда я хочу реализовать базу данных, я хочу назначить новую структуру базы данных глобальной конфигурации (project-) (например, config.База данных).

Однако это не работает, поскольку я не могу назначить conf новую структуру (которая реализует интерфейс базы данных).Интерфейс базы данных, например

 project app 

type OtherAppDatabase struct {
    *sql.DB
}

func (db *OtherAppDatabase) InitDatabase() error {
    conf := config.GetConfig() // this just returns the global config file

    conf.Database = d // This does not work [1]
}

func (db *OtherAppDatabase) OtherFunc1() {}

  

[1]: Невозможно использовать ‘db’ (тип *OtherAppDatabase) в качестве типа * database.База данных в назначении
Информация об инспекции: Сообщает о несовместимых типах в двоичных и унарных выражениях.

Есть ли способ сохранить одно поле базы данных в глобальной конфигурации и назначить ему конкретную базу данных по мере необходимости?

Спасибо и с наилучшими пожеланиями,

Комментарии:

1. Если вы создадите «глобальную базу данных» интерфейсом, то сможете присвоить ей любое значение, удовлетворяющее интерфейсу. Однако это приведет к другой проблеме: будут доступны только методы в интерфейсе, без выполнения утверждения типа. Итак, TL; DR; ваш дизайн кажется сломанным.

2. Это работает с утверждением типа в каждой команде, есть ли способ сохранить утвержденный интерфейс в исходном интерфейсе?

3. Нет. Go имеет статическую типизацию.