Kính gửi các nhà phát triển đồng nghiệp,
Tôi gặp vấn đề này có vẻ hơi kỳ lạ đối với tôi. Hãy xem đoạn mã này:
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
}
Trên một số gói khác, tôi có mã sau:
func DoFilter() {
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(fieldfilter) // <--- Exception is raised here
}
Thời gian chạy sẽ không chấp nhận dòng được đề cập bởi vì
"không thể sử dụng fieldfilter (loại * coreinterfaces.FieldFilter) làm loại * coreinterfaces.FilterInterface trong đối số là fieldint.AddFilter: * coreinterfaces.FilterInterface là con trỏ tới giao diện, không phải giao diện"
Tuy nhiên, khi thay đổi mã thành:
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)
}
Mọi thứ đều ổn và khi gỡ lỗi ứng dụng, nó thực sự có vẻ bao gồm
Tôi hơi bối rối về chủ đề này. Khi xem các bài đăng trên blog khác và các luồng tràn ngăn xếp thảo luận về vấn đề tương tự chính xác này (ví dụ - Cái này hoặc Cái này ), đoạn mã đầu tiên nêu ra ngoại lệ này sẽ hoạt động, vì cả bộ lọc trường và bản đồ trường đều được khởi tạo dưới dạng con trỏ đến giao diện, thay vì giá trị của các giao diện. Tôi không thể hiểu những gì thực sự xảy ra ở đây mà tôi cần phải thay đổi để không phải khai báo FieldInterface và chỉ định việc triển khai cho giao diện đó. Phải có một cách thanh lịch để làm điều này.
* FilterInterface
một cấu trúc triển khai giao diện này, điều này phá vỡ ý tưởng truyền giao diện cho các hàm. Những gì tôi muốn đạt được không bị ràng buộc với cấu trúc mà tôi đã chuyển, mà là bất kỳ cấu trúc nào triển khai giao diện mà tôi muốn sử dụng. Bất kỳ thay đổi mã nào bạn có thể cho là hiệu quả hơn hoặc đạt tiêu chuẩn để tôi thực hiện? Sẽ rất vui mừng khi sử dụng một số dịch vụ xem xét mã :)
* FilterInterface
thànhFilterInterface
Dòng_ = filtermap.AddFilter(fieldfilter)
hiện tại nảy sinh điều này: không thể sử dụng bộ lọc trường (loại coreinterfaces.FieldFilter) làm loại coreinterfaces.FilterInterface trong đối số thành filtermap.AddFilter: coreinterfaces.FieldFilter không triển khai coreinterfaces.FilterInterface (Phương thức lọc có bộ thu con trỏ) Tuy nhiên khi thay đổi dòng để_ = filtermap.AddFilter(&fieldfilter)
nó hoạt động. chuyện gì xảy ra ở đây thế? tại sao vậy?