Caros colegas desenvolvedores,
Estou com um problema que me parece um pouco estranho. Dê uma olhada neste snippet 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 aceitará a linha mencionada porque
"não pode usar fieldfilter (tipo * coreinterfaces.FieldFilter) como tipo * coreinterfaces.FilterInterface no argumento para fieldint.AddFilter: * coreinterfaces.FilterInterface é um ponteiro para interface, não 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)
}
Tudo está bem e ao depurar o aplicativo parece realmente incluir
Estou um pouco confuso sobre este assunto. Ao olhar para outras postagens de blog e tópicos de estouro de pilha discutindo exatamente o mesmo problema (por exemplo - This ou This ), o primeiro snippet que levanta essa exceção deve funcionar, porque fieldfilter e fieldmap são inicializados como ponteiros para interfaces, em vez de valor de interfaces. Não consegui entender o que realmente acontece aqui e que preciso mudar para não declarar um FieldInterface e atribuir a implementação para essa interface. Deve haver uma maneira elegante de fazer isso.
* FilterInterface
para uma estrutura que implementa essa interface, isso quebra a ideia de passar interfaces para funções. O que eu queria realizar não era estar vinculado à estrutura que estava passando, mas sim qualquer estrutura que implemente a interface que estou interessado em usar. Alguma alteração de código que você possa considerar mais eficiente ou dentro dos padrões para eu fazer? Terei prazer em usar alguns serviços de revisão de código :)
* FilterInterface
paraFilterInterface
A linha_ = filtermap.AddFilter(fieldfilter)
agora aumenta isso: não é possível usar fieldfilter (digite coreinterfaces.FieldFilter) como tipo coreinterfaces.FilterInterface no argumento para filtermap.AddFilter: coreinterfaces.FieldFilter não implementa coreinterfaces.FilterInterface (método de filtro tem receptor de ponteiro) No entanto, ao alterar o linha para_ = filtermap.AddFilter(&fieldfilter)
ele funciona. o que acontece aqui? por que é que?