Liebe Entwicklerkollegen,
Ich habe dieses Problem, das mir etwas komisch vorkommt. Schauen Sie sich diesen Codeausschnitt an:
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
}
Auf einem anderen Paket habe ich den folgenden Code:
func DoFilter() {
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(fieldfilter) // <--- Exception is raised here
}
Die Laufzeit akzeptiert die erwähnte Zeile nicht, weil
"Feldfilter (Typ * coreinterfaces.FieldFilter) kann nicht als Typ * coreinterfaces.FilterInterface im Argument zu fieldint.AddFilter verwendet werden: * coreinterfaces.FilterInterface ist Zeiger auf Schnittstelle, nicht Schnittstelle"
Wenn Sie den Code jedoch ändern 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)
}
Alles ist in Ordnung und beim Debuggen der Anwendung scheint es wirklich zu enthalten
Ich bin etwas verwirrt über dieses Thema. Wenn Sie sich andere Blog-Beiträge und Stapelüberlauf-Threads ansehen, in denen genau dasselbe Problem behandelt wird (z. B. Dies oder Dies ), sollte das erste Snippet funktionieren, das diese Ausnahme auslöst, da sowohl Feldfilter als auch Feldzuordnung als Zeiger auf Schnittstellen und nicht als Wert von initialisiert werden Schnittstellen. Ich konnte mich nicht mit dem befassen, was hier tatsächlich passiert und was ich ändern muss, damit ich kein FieldInterface deklariere und die Implementierung für diese Schnittstelle zuweise. Es muss einen eleganten Weg geben, dies zu tun.
* FilterInterface
in eine Struktur, die diese Schnittstelle implementiert, wird die Idee, Schnittstellen an Funktionen zu übergeben, zunichte gemacht. Was ich erreichen wollte, ist nicht an die Struktur gebunden zu sein, die ich übergeben habe, sondern an jede Struktur, die die Schnittstelle implementiert, die ich verwenden möchte . Gibt es Codeänderungen, die Ihrer Meinung nach effizienter sind oder den von mir zu erwartenden Standards entsprechen? Ich werde froh sein, einige
* FilterInterface
aufFilterInterface
die Linie_ = filtermap.AddFilter(fieldfilter)
jetzt wirft dies: nicht verwenden kann fieldfilter (Typ coreinterfaces.FieldFilter) als Typ coreinterfaces.FilterInterface in Argumente filtermap.AddFilter: coreinterfaces.FieldFilter nicht implementiert coreinterfaces.FilterInterface (Filter - Methode hat Empfänger Zeiger) jedoch , wenn der Wechsel Linie dazu_ = filtermap.AddFilter(&fieldfilter)
funktioniert. was geschieht hier? warum ist das so?