Sevgili geliştiriciler,
Bana biraz tuhaf görünen bu problemim var. Şu kod pasajına bir göz atın:
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
}
Başka bir pakette aşağıdaki koda sahibim:
func DoFilter() {
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(fieldfilter) // <--- Exception is raised here
}
Çalışma zamanı belirtilen satırı kabul etmiyor çünkü
"fieldint.AddFilter değişkeninde * coreinterfaces.FilterInterface türü olarak fieldfilter (type * coreinterfaces.FieldFilter) kullanılamaz: * coreinterfaces.FilterInterface arabirime değil arabirime işaretleyicidir"
Ancak, kodu şu şekilde değiştirirken:
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)
}
Her şey yolunda ve uygulamada hata ayıklarken gerçekten içeriyor gibi görünüyor
Bu konuda biraz kafam karıştı. Aynı sorunu tartışan diğer blog gönderilerine ve yığın taşma konularına bakarken (örneğin - Bu veya Bu ) bu istisnayı ortaya çıkaran ilk kod parçası çalışmalıdır, çünkü hem alan filtresi hem de alan haritası değeri yerine arayüzlere işaretçiler olarak başlatılır. arayüzler. Bir FieldInterface bildirmemem ve bu arabirim için uygulamayı atamamam için değiştirmem gereken burada gerçekte olanlara kafamı veremedim. Bunu yapmanın zarif bir yolu olmalı.
* FilterInterface
içinFilterInterface
hat_ = filtermap.AddFilter(fieldfilter)
: Bu yükseltir coreinterfaces.FieldFilter coreinterfaces.FilterInterface uygulamaz (süzme yöntemi işaretçi alıcısı vardır): filtermap.AddFilter argüman tip coreinterfaces.FilterInterface olarak (tip coreinterfaces.FieldFilter) fieldfilter kullanamaz değiştirirken Ancak satır_ = filtermap.AddFilter(&fieldfilter)
buna çalışır. Burada ne oluyor? Neden?