Confusão "<tipo> é ponteiro para interface, não interface"
Caros colegas desenvolvedores,
Eu tenho esse problema que me parece um pouco estranho. Dê uma olhada neste trecho 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
}
Em algum outro pacote, tenho o seguinte código:
func DoFilter() {
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(fieldfilter) // <--- Exception is raised here
}
O tempo de execução não aceita a linha mencionada porque
"não pode usar fieldfilter (tipo * coreinterfaces.FieldFilter) como tipo * coreinterfaces.FilterInterface no argumento fieldint.AddFilter: * coreinterfaces.FilterInterface é um ponteiro para a interface, não para a interface"
No entanto, ao alterar o código para:
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)
}
Está tudo bem e, ao depurar o aplicativo, ele realmente parece incluir
Estou um pouco confuso sobre esse assunto. Ao olhar para outras postagens do blog e empilhar threads em excesso, discutindo exatamente esse mesmo problema (por exemplo:esteoueste) o primeiro trecho que gera essa exceção deve funcionar, porque o filtro de campo e o mapa de campo são inicializados como ponteiros para interfaces, em vez de valor de interfaces. Não fui capaz de entender o que realmente acontece aqui, que preciso alterar para não declarar um FieldInterface e atribuir a implementação para essa interface. Deve haver uma maneira elegante de fazer isso.