Estimados compañeros desarrolladores,
Tengo este problema que me parece un poco extraño. Eche un vistazo a este fragmento de código:
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
}
En algún otro paquete, tengo el siguiente código:
func DoFilter() {
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(fieldfilter) // <--- Exception is raised here
}
El tiempo de ejecución no aceptará la línea mencionada porque
"no se puede usar fieldfilter (tipo * coreinterfaces.FieldFilter) como tipo * coreinterfaces.FilterInterface en el argumento de fieldint.AddFilter: * coreinterfaces.FilterInterface es un puntero a la interfaz, no a la interfaz"
Sin embargo, al cambiar el código a:
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)
}
Todo está bien y al depurar la aplicación realmente parece incluir
Estoy un poco confundido sobre este tema. Al mirar otras publicaciones de blog y los subprocesos de desbordamiento de pila que discuten exactamente este mismo problema (por ejemplo, esto o esto ), el primer fragmento que genera esta excepción debería funcionar, porque tanto el filtro de campo como el mapa de campo se inicializan como punteros a interfaces, en lugar del valor de interfaces. No he podido entender lo que realmente sucede aquí que necesito cambiar para no declarar una FieldInterface y asignar la implementación para esa interfaz. Debe haber una forma elegante de hacer esto.
* FilterInterface
a una estructura que implementa esta interfaz, se rompe la idea de pasar interfaces a funciones. Lo que quería lograr no es estar vinculado a la estructura que estaba pasando, sino a cualquier estructura que implemente la interfaz que me interesa usar. ¿Algún cambio de código que pueda pensar que es más eficiente o que cumple con los estándares para mí? Estaré encantado de utilizar algunos servicios de revisión de código :)
* FilterInterface
aFilterInterface
La línea_ = filtermap.AddFilter(fieldfilter)
ahora surge esto: no se puede usar fieldfilter (tipo coreinterfaces.FieldFilter) como tipo coreinterfaces.FilterInterface en argumento para filtermap.AddFilter: coreinterfaces.FieldFilter no implementa coreinterfaces.FilterInterface (El método de filtro tiene puntero receptor) Sin embargo, al cambiar el línea a_ = filtermap.AddFilter(&fieldfilter)
que funciona. ¿Qué pasa aquí? ¿porqué es eso?