Chers collègues développeurs,
J'ai ce problème qui me semble un peu étrange. Jetez un œil à cet extrait de code:
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
}
Sur un autre package, j'ai le code suivant:
func DoFilter() {
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(fieldfilter) // <--- Exception is raised here
}
Le run-time n'acceptera pas la ligne mentionnée car
"ne peut pas utiliser fieldfilter (type * coreinterfaces.FieldFilter) comme type * coreinterfaces.FilterInterface dans l'argument de fieldint.AddFilter: * coreinterfaces.FilterInterface est un pointeur vers l'interface, pas l'interface"
Cependant, lorsque vous modifiez le code en:
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)
}
Tout va bien et lors du débogage de l'application, il semble vraiment inclure
Je suis un peu confus sur ce sujet. Lorsque vous consultez d'autres articles de blog et les threads de débordement de pile discutant exactement du même problème (par exemple - Ceci ou Ceci ), le premier extrait de code qui lève cette exception devrait fonctionner, car fieldfilter et fieldmap sont initialisés en tant que pointeurs vers des interfaces, plutôt que comme valeur de les interfaces. Je n'ai pas été en mesure de comprendre ce qui se passe réellement ici et que je dois changer pour ne pas déclarer une FieldInterface et affecter l'implémentation de cette interface. Il doit y avoir une manière élégante de faire cela.
* FilterInterface
àFilterInterface
La ligne_ = filtermap.AddFilter(fieldfilter)
lève maintenant ceci: impossible d'utiliser fieldfilter (type coreinterfaces.FieldFilter) comme type coreinterfaces.FilterInterface en argument en filtermap.AddFilter: coreinterfaces.FieldFilter n'implémente pas coreinterfaces.FilterInterface (la méthode Filter a un récepteur de pointeur) Cependant lors du changement de ligne à_ = filtermap.AddFilter(&fieldfilter)
cela fonctionne. Que se passe t-il ici? pourquoi donc?