Cari colleghi sviluppatori,
Ho questo problema che mi sembra un po 'strano. Dai un'occhiata a questo frammento di codice:
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
}
Su qualche altro pacchetto, ho il seguente codice:
func DoFilter() {
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(fieldfilter) // <--- Exception is raised here
}
Il run-time non accetterà la riga menzionata perché
"non è possibile utilizzare fieldfilter (tipo * coreinterfaces.FieldFilter) come tipo * coreinterfaces.FilterInterface nell'argomento di fieldint.AddFilter: * coreinterfaces.FilterInterface è un puntatore all'interfaccia, non all'interfaccia"
Tuttavia, quando si modifica il codice in:
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)
}
Va tutto bene e durante il debug dell'applicazione sembra davvero includere
Sono un po 'confuso su questo argomento. Quando si esaminano altri post del blog e thread di overflow dello stack che discutono di questo stesso identico problema (ad esempio - Questo o Questo ) il primo frammento che solleva questa eccezione dovrebbe funzionare, perché sia fieldfilter che fieldmap sono inizializzati come puntatori alle interfacce, piuttosto che valore di interfacce. Non sono stato in grado di capire cosa succede effettivamente qui che devo cambiare per non dichiarare un FieldInterface e assegnare l'implementazione per quell'interfaccia. Ci deve essere un modo elegante per farlo.
* FilterInterface
a una struttura che implementa questa interfaccia, questo rompe l'idea di passare le interfacce alle funzioni. Quello che volevo ottenere non era essere vincolato a quale struttura stavo passando, ma piuttosto a qualsiasi struttura che implementa l'interfaccia che mi interessa usare. Eventuali modifiche al codice che potresti ritenere più efficienti o conformi agli standard per me? Sarò felice di utilizzare alcuni servizi di revisione del codice :)
* FilterInterface
passa aFilterInterface
La riga_ = filtermap.AddFilter(fieldfilter)
ora solleva questo: non è possibile utilizzare fieldfilter (tipo coreinterfaces.FieldFilter) come tipo coreinterfaces.FilterInterface nell'argomento di filtermap.AddFilter: coreinterfaces.FieldFilter non implementa coreinterfaces.FilterInterface (il metodo Filter ha il ricevitore del puntatore) Tuttavia quando si cambia il linea per_ = filtermap.AddFilter(&fieldfilter)
funzionare. Che succede qui? perché?