У меня есть глобальная конфигурация для большинства настроек (например, лог файлов), которые я использую во всех проектах, например:
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()
}
Когда я хочу реализовать базу данных, я хочу назначить новую структуру базы данных (глобальной) конфигурации проекта (например, config.Database).
Однако это не работает, поскольку я не могу назначить новую структуру (которая реализует интерфейс базы данных) для интерфейса conf.Database, например,
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.Database в назначении
Информация о проверке: сообщает о несовместимых типах в двоичных и унарных выражениях.
Есть ли способ сохранить одно поле базы данных в глобальной конфигурации и назначить ему определенную базу данных при необходимости?
Спасибо и всего наилучшего,