#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 имеет статическую типизацию.