Уважаемые коллеги-разработчики!
У меня возникла эта проблема, которая мне кажется немного странной. Взгляните на этот фрагмент кода:
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)
}
Все в порядке и при отладке приложения действительно вроде включает
Я немного запутался в этой теме. При просмотре других сообщений в блогах и потоков переполнения стека, обсуждающих ту же самую проблему (например, This или This ), первый фрагмент, который вызывает это исключение, должен работать, потому что и fieldfilter, и fieldmap инициализируются как указатели на интерфейсы, а не как значение интерфейсы. Я не мог осмыслить то, что на самом деле здесь происходит, что мне нужно изменить, чтобы я не объявлял FieldInterface и не назначал реализацию для этого интерфейса. Должен быть изящный способ сделать это.
* FilterInterface
наFilterInterface
Строка_ = filtermap.AddFilter(fieldfilter)
теперь вызывает следующее: нельзя использовать fieldfilter (тип coreinterfaces.FieldFilter) в качестве типа coreinterfaces.FilterInterface в аргументе filtermap.AddFilter: coreinterfaces.FieldFilter не реализует coreinterfaces.FilterInterface (метод фильтра имеет приемник указателя) Однако при изменении строка к_ = filtermap.AddFilter(&fieldfilter)
нему работает. Что здесь происходит? это почему?