Drodzy programiści,
Mam ten problem, który wydaje mi się trochę dziwny. Spójrz na ten fragment kodu:
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
}
Na innym pakiecie mam następujący kod:
func DoFilter() {
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(fieldfilter) // <--- Exception is raised here
}
Środowisko wykonawcze nie zaakceptuje wspomnianej linii, ponieważ
„nie można użyć fieldfilter (type * coreinterfaces.FieldFilter) jako type * coreinterfaces.FilterInterface w argumencie do fieldint.AddFilter: * coreinterfaces.FilterInterface jest wskaźnikiem do interfejsu, a nie interfejsu”
Jednak przy zmianie kodu na:
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)
}
Wszystko jest w porządku, a podczas debugowania aplikacji naprawdę wydaje się, że zawiera
Jestem trochę zdezorientowany w tym temacie. Patrząc na inne posty na blogu i wątki przepełnienia stosu omawiające dokładnie ten sam problem (na przykład - This lub This ), pierwszy fragment kodu, który wywołuje ten wyjątek, powinien działać, ponieważ zarówno fieldfilter, jak i fieldmap są inicjowane jako wskaźniki do interfejsów, a nie wartość interfejsy. Nie byłem w stanie ogarnąć tego, co właściwie się tutaj dzieje, co muszę zmienić, aby nie zadeklarować FieldInterface i przypisać implementacji dla tego interfejsu. Musi być na to elegancki sposób.
* FilterInterface
naFilterInterface
The line_ = filtermap.AddFilter(fieldfilter)
teraz podnosi to: nie można użyć fieldfilter (typ coreinterfaces.FieldFilter) jako typ coreinterfaces.FilterInterface w argumencie do filtermap.AddFilter: coreinterfaces.FieldFilter nie implementuje coreinterfaces.FilterInterface (metoda filtru ma odbiornik wskaźnika) Jednak podczas zmiany linia do_ = filtermap.AddFilter(&fieldfilter)
tego działa. co się tutaj stało? dlaczego?