Шановні колеги-розробники,
У мене є ця проблема, яка мені здається трохи дивною. Погляньте на цей фрагмент коду:
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, і mapma поля ініціалізуються як вказівники на інтерфейси, а не значення інтерфейси. Я не зміг обернути голову навколо того, що насправді відбувається тут, що мені потрібно змінити, щоб я не оголосив FieldInterface і призначив реалізацію для цього інтерфейсу. Має бути елегантний спосіб зробити це.
* FilterInterface
структури, яка реалізує цей інтерфейс, це порушує ідею передачі інтерфейсів функціям. Що я хотів досягти, це не прив’язаність до тієї структури, яку я проходив, а скоріше будь-яка структура, що реалізує інтерфейс, який мені цікаво використовувати. Будь-які зміни коду, на вашу думку, можна зробити більш ефективними або відповідати стандартам? Я буду радий скористатися послугами з перегляду коду :)
* FilterInterface
доFilterInterface
Лінії_ = filtermap.AddFilter(fieldfilter)
Тепер піднімає це: не може використовувати fieldfilter (типу coreinterfaces.FieldFilter) як тип coreinterfaces.FilterInterface в аргументі filtermap.AddFilter: coreinterfaces.FieldFilter не реалізує coreinterfaces.FilterInterface (метод фільтрації має приймач покажчика) Однак при зміні напрямку рядок до_ = filtermap.AddFilter(&fieldfilter)
нього працює. Що тут відбувається? чому так?