प्रिय साथी डेवलपर्स,
मुझे यह समस्या है जो मुझे थोड़ी अजीब लगती है। कोड के इस स्निपेट पर एक नज़र डालें:
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
}
कुछ अन्य पैकेज पर, मेरे पास निम्नलिखित कोड हैं:
func DoFilter() {
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(fieldfilter) // <--- Exception is raised here
}
रन-टाइम, उल्लिखित लाइन को स्वीकार नहीं करेगा क्योंकि
"fieldfilter का उपयोग नहीं कर सकते हैं (type * coreinterfaces.FieldFilter) प्रकार के रूप में * coreinterfaces.FilterInterface तर्क के लिए fieldint.AddFilter में: * coreinterfaces.FilterInterface इंटरफ़ेस के लिए सूचक है, इंटरफ़ेस नहीं"
हालाँकि, कोड को बदलते समय:
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)
}
सब कुछ ठीक है और जब आवेदन डिबगिंग होता है तो यह वास्तव में शामिल लगता है
मैं इस विषय पर थोड़ा भ्रमित हूं। अन्य ब्लॉग पोस्टों को देखने और स्टैक ओवरफ्लो थ्रेड्स पर चर्चा करते हुए इसी सटीक मुद्दे पर चर्चा की जाती है (उदाहरण के लिए - यह , या यह ) पहला स्निपेट जो इस अपवाद को उठाता है, उसे काम करना चाहिए, क्योंकि फ़ील्डफिल्टर और फील्डमैप दोनों को इंटरफेस के रूप में इनिशियलाइज़ किया जाता है, बजाय वैल्यू के इंटरफेस। मैं अपने सिर को इधर उधर नहीं लपेट पा रहा हूं कि वास्तव में यहां क्या होता है कि मुझे फील्डइंटरफेस की घोषणा न करने और उस इंटरफेस के लिए कार्यान्वयन को आवंटित करने के लिए मुझे बदलने की आवश्यकता है। ऐसा करने का एक सुंदर तरीका होना चाहिए।
* FilterInterface
हो रहा है, तो इसे उठाता है: फ़िल्टर करने के लिए तर्क के रूप में fieldfilter (type coreinterfaces.FieldFilter) का उपयोग नहीं कर सकते हैं । करने के लिए लाइन यह काम करता है। यहाँ क्या हुआ? ऐसा क्यों है?FilterInterface
_ = filtermap.AddFilter(fieldfilter)
_ = filtermap.AddFilter(&fieldfilter)