Rekan pengembang yang terhormat,
Saya punya masalah ini yang tampaknya agak aneh bagi saya. Lihat cuplikan kode ini:
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
}
Di beberapa paket lain, saya memiliki kode berikut:
func DoFilter() {
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(fieldfilter) // <--- Exception is raised here
}
Waktu proses tidak akan menerima baris yang disebutkan karena
"tidak dapat menggunakan fieldfilter (ketik * coreinterfaces.FieldFilter) sebagai jenis * coreinterfaces.FilterInterface dalam argumen ke fieldint.AddFilter: * coreinterfaces.FilterInterface adalah penunjuk ke antarmuka, bukan antarmuka"
Namun, saat mengubah kode menjadi:
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)
}
Semuanya baik-baik saja dan saat men-debug aplikasi itu sepertinya benar-benar disertakan
Saya agak bingung dengan topik ini. Saat melihat posting blog lain dan utas stack overflow yang membahas masalah yang sama persis (misalnya - Ini , atau Ini ), potongan pertama yang memunculkan pengecualian ini seharusnya berfungsi, karena fieldfilter dan fieldmap diinisialisasi sebagai penunjuk ke antarmuka, bukan nilai antarmuka. Saya belum bisa memahami apa yang sebenarnya terjadi di sini yang perlu saya ubah agar saya tidak mendeklarasikan FieldInterface dan menetapkan implementasi untuk antarmuka itu. Harus ada cara yang elegan untuk melakukan ini.
* FilterInterface
menjadi struct yang mengimplementasikan antarmuka ini, ini mematahkan gagasan untuk meneruskan antarmuka ke fungsi. Apa yang ingin saya capai bukanlah terikat pada struktur apa yang saya lewati, melainkan apa saja struct yang mengimplementasikan antarmuka yang ingin saya gunakan. Adakah perubahan kode yang menurut Anda lebih efisien atau sesuai standar yang harus saya lakukan? Saya akan dengan senang hati menggunakan beberapa layanan peninjauan kode :)
* FilterInterface
keFilterInterface
The line_ = filtermap.AddFilter(fieldfilter)
now memunculkan ini: tidak dapat menggunakan fieldfilter (ketik coreinterfaces.FieldFilter) sebagai tipe coreinterfaces.FilterInterface dalam argumen ke filtermap.AddFilter: coreinterfaces.FieldFilter tidak mengimplementasikan coreinterfaces.FilterInterface (metode Filter memiliki penerima pointer) Namun ketika mengubah baris untuk_ = filtermap.AddFilter(&fieldfilter)
bekerja. Apa yang terjadi di sini? mengapa demikian?