Уважаемые коллеги разработчики!
У меня есть эта проблема, которая кажется мне немного странной. Посмотрите на этот фрагмент кода:
package coreinterfaces
type FilterInterface interface {
Filter(s *string) bool
}
type FieldFilter struct {
Key string
Val string
}
func (ff *FieldFilter) Filter(s *string) bool {
// Some code
}
type FilterMapInterface interface {
AddFilter(f *FilterInterface) uuid.UUID
RemoveFilter(i uuid.UUID)
GetFilterByID(i uuid.UUID) *FilterInterface
}
type FilterMap struct {
mutex sync.Mutex
Filters map[uuid.UUID]FilterInterface
}
func (fp *FilterMap) AddFilter(f *FilterInterface) uuid.UUID {
// Some code
}
func (fp *FilterMap) RemoveFilter(i uuid.UUID) {
// Some code
}
func (fp *FilterMap) GetFilterByID(i uuid.UUID) *FilterInterface {
// Some code
}
На некоторых других пакетах у меня есть следующий код:
func DoFilter() {
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(fieldfilter) // <--- Exception is raised here
}
Среда выполнения не примет упомянутую строку, потому что
"нельзя использовать fieldfilter (тип * coreinterfaces.FieldFilter) в качестве типа * coreinterfaces.FilterInterface в аргументе для fieldint.AddFilter: * coreinterfaces.FilterInterface - указатель на интерфейс, а не интерфейс"
Однако при изменении кода на:
func DoBid() error {
bs := string(b)
var ifilterfield coreinterfaces.FilterInterface
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
ifilterfield = fieldfilter
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(&ifilterfield)
}
Все хорошо, и при отладке приложения оно действительно включает
Я немного запутался в этой теме. При просмотре других сообщений блога и потоков, обсуждающих ту же самую проблему (например, - Это или Это), первый фрагмент кода, который вызывает это исключение, должен работать, потому что и fieldfilter, и fieldmap инициализируются как указатели на интерфейсы, а не как значение интерфейсы. Я не смог обернуть голову вокруг того, что на самом деле происходит здесь, и что мне нужно изменить, чтобы я не объявлял FieldInterface и не назначал реализацию для этого интерфейса. Должен быть элегантный способ сделать это.