@AnonymFromInternet

Go. Интерфейсы. Не знаю как сформулировать вопрос :). Зачем такое?

Не понимаю для чего это используется.

Есть структура Repository:
type Repository struct {
	AppConfig *config.AppConfig
	DB        repository.DatabaseRepository
}


Также есть структура:
type postgresDBRepo struct {
	AppConfig *config.AppConfig
	DB        *sql.DB
}


Есть интерфейс:
package repository
type DatabaseRepository interface {
	InsertReservation(reservation models.Reservation) error
}

Входящий аргумент models.Reservation - это просто структура с кучей полей, которые планируют хранить в своих свойствах данные из инпутов на странице.

Есть метод у структуры postgresDBRepo, который имплементирует метод интерфейса:
func (postgresDBRepo *postgresDBRepo) InsertReservation(reservation models.Reservation) error {


Есть функция, которая создает новый экземпляр типа postgresDBRepo и возвращает его как тип DatabaseRepository:
func NewPostgresDBRepo(appConfigAsParam *config.AppConfig, db *sql.DB) repository.DatabaseRepository {
	return &postgresDBRepo{
		AppConfig: appConfigAsParam,
		DB:        db,
	}
}

Дальше по ходу пьесы в одном из Post хэндлеров, который имеет ресивер к структуре Repository происходит следующее:
func (repo *Repository) PostReservation(writer http.ResponseWriter, request *http.Request) {
...
err = repo.DB.InsertReservation(data)
}


Также есть функция, которая вызывается в методе main и по факту переносит данные из одного пакета в другой:
func NewRepo(appConfig *config.AppConfig, db *driver.DB) *Repository {
	return &Repository{
		AppConfig: appConfig,
		DB:        dbRepo.NewPostgresDBRepo(appConfig, db.SQL),
	}
}


Итого имеем:
Экземпляр структуры Repository, в свойстве AppConfig которого находится информация с типом данных *config.AppConfig.
В свойстве DB, информация с типом данных DatabaseRepository. По факту туда через вызов функции NewPostgresDBRepo помещается объект со свойствами AppConfig, тип данных *config.AppConfig и свойство DB, тип данных *sql.DB.
Но обратиться внутри свойства DB я могу только к методу InsertReservation(). И оно не удивительно, так как это тип данных DatabaseRepository, и у его есть этот метод.

Но вопрос в том, а нафига вообще функция NewPostgresDBRepo создает внутри себя объект (и указатель на него) типа postgresDBRepo и помещает в его свойства какие либо данные, если к ним и обратиться нельзя? Как это вообще используется? И также в AppConfig лежат данные *config.AppConfig и они же находятся в DB.AppConfig.

Такой вот вопрос.
Спасибо заранее за ответ.
  • Вопрос задан
  • 191 просмотр
Пригласить эксперта
Ответы на вопрос 1
ivankprod
@ivankprod
Системный / веб fullstack-разработчик
Вообще, тут пытались юзать чистую архитектуру, но получилось как-то кривовато :)

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

Войдите, чтобы написать ответ

Похожие вопросы