Chers développeurs,
J'ai ce problème qui semble un peu bizarre pour moi. Regardez 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 paquet, 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 moment de l'exécution n'accepte pas la ligne, parce que
"ne peut pas utiliser fieldfilter (type *coreinterfaces.FieldFilter) type de *coreinterfaces.FilterInterface en argument à fieldint.AddFilter: *coreinterfaces.FilterInterface est pointeur vers l'interface, pas d'interface"
Cependant, lors de la modification du code:
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. Quand on regarde les autres posts de blog et de dépassement de pile discussions exactement le même problème (par exemple - Ce, ou C') le premier extrait qui soulève cette exception devrait fonctionner, parce que les deux fieldfilter et field-map sont initialisés comme des pointeurs vers des interfaces, plutôt que de la valeur des interfaces. Je n'ai pas été capable d'envelopper ma tête autour de ce qui se passe réellement ici que j'ai besoin de changement dans l'ordre pour moi de ne pas déclarer un FieldInterface et affecter la mise en œuvre de cette interface. Il doit y avoir un moyen élégant pour ce faire.