Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
такой подход рекомендован в Go
type (
AMQPHandler struct {
repository Repository
}
Repository interface {
Add(user *User) error
FindByID(ID string) (*User, error)
FindByEmail(email string) (*User, error)
FindByCountry(country string) (*User, error)
FindByEmailAndCountry(country string) (*User, error)
Search(...CriteriaOption) ([]*User, error)
Remove(ID string) error
// и еще
// и еще
// и еще
// ...
}
)
type (
AMQPHandler struct {
repository Repository
}
Repository interface {
RepositoryAdder
RepositoryFinderByID
RepositoryFinderByEmail
RepositoryFinderByCountry
RepositoryFinderByEmailAndCountry
RepositorySearcher
RepositoryRemover
// и еще
// и еще
// и еще
// ...
}
RepositoryAdder interface {
Add(user *User) error
}
RepositoryFinderByID interface {
FindByID(ID string) (*User, error)
}
RepositoryFinderByEmail interface {
FindByEmail(email string) (*User, error)
}
RepositoryFinderByCountry interface {
FindByCountry(country string) (*User, error)
}
RepositoryFinderByEmailAndCountry interface {
FindByEmailAndCountry(country string) (*User, error)
}
RepositorySearcher interface {
Search(...CriteriaOption) ([]*User, error)
}
RepositoryRemover interface {
Remove(ID string) error
}
)
Repository interface {
Adder
Finder
Searcher
Remover
}
type RepositoryFindRemover interface {
RepositoryFinderByEmail
RepositoryRemover
}
А как стоит поступить, если, к примеру, необходимо одновременно найти по Email и удалить?
Например, если у вас есть несколько структур с полем ID типа int64, то вы никак не можете создать функцию, которая бы принимала на вход любой из этих типов и работала с полем ID. Создавать id_getter и id_setter для каждой структуры?
В общем либо я не умею мыслить как настоящий программист на Go, либо я испорчен той свободой, которую даёт Python.
type IDer interface {
IDSetter(id string)
IDGetter() string
}
type CustomPropsExample struct {
I, J int
// Sum is not stored, but should always be equal to I + J.
Sum int `datastore:"-"`
}
func (x *CustomPropsExample) Load(ps []datastore.Property) error {
// Load I and J as usual.
if err := datastore.LoadStruct(x, ps); err != nil {
return err
}
// Derive the Sum field.
x.Sum = x.I + x.J
return nil
}
func (x *CustomPropsExample) Save() ([]datastore.Property, error) {
// Validate the Sum field.
if x.Sum != x.I + x.J {
return errors.New("CustomPropsExample has inconsistent sum")
}
// Save I and J as usual. The code below is equivalent to calling
// "return datastore.SaveStruct(x)", but is done manually for
// demonstration purposes.
return []datastore.Property{
{
Name: "I",
Value: int64(x.I),
},
{
Name: "J",
Value: int64(x.J),
},
}
}И я уже десять раз пожалел, что начал нынешний домашний проект на Go, тем более, что вся эта шикарная производительность, которую даёт Go, мне нафиг не нужна и не будет.
type BaseStruct struct {
ID string
data interface{}
}
type BaseStruct struct {
ID string
StructA *StructTypeA
StructB *StructTypeB
}всё, что мы можем с ним сделать — это вызывать функции, из которых состоит этот интерфейс
Интерфейс для того и нужен, чтобы скрыть конкретную реализацию, запретив потребительскому коду зависеть от ее деталей, разве не в этом была идея их появления?
Например, если у вас есть несколько структур с полем ID типа int64, то вы никак не можете создать функцию, которая бы принимала на вход любой из этих типов и работала с полем ID.
Мне кажется, вы смешали композицию интерфейсов для работы с данными и сами структуры данных. Правда вопрос с совпадением имен методов в 2 интерфейсах требует уточнения.
В общем либо я не умею мыслить как настоящий программист на Go, либо я испорчен той свободой, которую даёт Python.
Каюсь, я тоже не проникся духом Go, и поэтому пока остаюсь на питоне, подтягивая плюсы, где нужна скорость. Пробую на вкус раст, но пока еще не готов делиться впечатлениями.
А как стоит поступить, если, к примеру, необходимо одновременно найти по Email и удалить?
data.(FinderByEMail)
data.(Remover)type FinderAndRemover interface {
FinderByEMail
Remover
}
Композиция интерфейсов в Go