Я думаю, вы должны сделать что-то подобное, но я не уверен в синтаксисе.
package main
type Storage interface {
Get() (*Items, err)
}
type Items struct {
foo string
}
// Postgres database
type postgres struct {
db *sql.DB
}
func newPostgres(db *sql.DB) *postgres {
return &postgres{db}
}
func (p *postgres) Get() (*items, error){
// query something here
return nil, nil
}
// Mongo database
type mongodb struct {
mongo *session // i'am not sure about this
}
func newMongo (session) *mongdb {
return &mongdb{mongo: session}
}
func (m *mongdob) Get() (*items, error) {
// query something here
return nil, nil
}
// mock database
type mockDB struct {}
func newMock () mockDB {
return mockDB{}
}
func (m mockDB) Get() (*items, error) {
// query something here
return nil, nil
}
type ParentService struct{
db Storage
}
func NewParent(db Storage) *ParentService{
return &ParentService{db: db}
}
func (p *ParentService) doSomething() {
items, err := p.db.Get()
// do something with items
}
func main(){
db := connectPostgres()
pStorage := newPostgres(db)
parent := NewParent(pStorage)
sess := connectMongo()
mStorage := newMongo(sess)
parent := NewParent(mStorage)
mockStorage := mockDB()
parent := NewParent(mockStorage)
}