เรียนเพื่อนนักพัฒนา
ฉันมีปัญหานี้ซึ่งดูเหมือนจะแปลกสำหรับฉัน ดูตัวอย่างโค้ดนี้:
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 (พิมพ์ * coreinterfaces.FieldFilter) เป็น type * 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)
}
ทุกอย่างเรียบร้อยดีและเมื่อทำการดีบักแอปพลิเคชันดูเหมือนว่าจะรวมอยู่ด้วย
ฉันสับสนในหัวข้อนี้เล็กน้อย เมื่อดูบล็อกโพสต์อื่น ๆ และเธรดล้นสแต็กที่พูดถึงปัญหาเดียวกันนี้ (เช่น - นี่หรือ นี่ ) ตัวอย่างแรกที่ทำให้เกิดข้อยกเว้นนี้ควรใช้งานได้เนื่องจากทั้งฟิลเตอร์ฟิลด์และแมปฟิลด์ถูกเตรียมใช้งานเป็นตัวชี้ไปยังอินเทอร์เฟซแทนที่จะเป็นค่าของ อินเทอร์เฟซ ฉันไม่สามารถคาดเดาสิ่งที่เกิดขึ้นจริงที่นี่ได้ซึ่งฉันจำเป็นต้องเปลี่ยนแปลงเพื่อไม่ให้ฉันประกาศ FieldInterface และกำหนดการใช้งานสำหรับอินเทอร์เฟซนั้น ต้องมีวิธีที่สง่างามในการทำเช่นนี้
* FilterInterface
เป็นFilterInterface
The line_ = filtermap.AddFilter(fieldfilter)
จะเพิ่มสิ่งนี้: ไม่สามารถใช้ fieldfilter (พิมพ์ coreinterfaces.FieldFilter) เป็นชนิด coreinterfaces.FilterInterface ในการโต้แย้ง filtermap.AddFilter: coreinterfaces.FieldFilter ไม่ใช้ coreinterfaces.FilterInterface (วิธีการกรองมีตัวรับตัวชี้)อย่างไรก็ตามเมื่อเปลี่ยน บรรทัด_ = filtermap.AddFilter(&fieldfilter)
มันทำงาน เกิดอะไรขึ้นที่นี่? ทำไมเป็นอย่างนั้น?