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.

questionAnswers(2)

yourAnswerToTheQuestion