Не понимаю для чего это используется.
Есть структура 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.
Такой вот вопрос.
Спасибо заранее за ответ.