亲爱的开发人员,
我遇到了这个问题,对我来说似乎有点奇怪。看一下这段代码:
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
}
运行时不接受提到的行,因为
“不能在fieldint.AddFilter的参数中将fieldfilter(类型* coreinterfaces.FieldFilter)用作类型* coreinterfaces.FilterInterface:* 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)
}
一切都很好,并且在调试应用程序时,它似乎确实包括
我对此话题有些困惑。当看着其他博客和堆栈溢出线程讨论这个完全一样的问题(例如- 这,或 这)这引起了这个异常应该工作,因为这两个fieldfilter和fieldmap初始化为指针接口,而不是价值的第一个片段接口。为了避免不声明FieldInterface并为该接口分配实现,我一直无法解决这里实际发生的事情。必须有一个优雅的方法来做到这一点。
* FilterInterface
实现此接口的结构,这打破了将接口传递给函数的想法。我想要实现的目标不是绑定到我传递的结构上,而是实现我有兴趣使用的接口的任何结构。您可能认为对我而言更有效或符合标准的任何代码更改?我很高兴使用一些代码检查服务:)
* FilterInterface
到FilterInterface
线_ = filtermap.AddFilter(fieldfilter)
现在引发此:不能在参数中使用fieldfilter(类型coreinterfaces.FieldFilter)类型coreinterfaces.FilterInterface到filtermap.AddFilter:coreinterfaces.FieldFilter不实现coreinterfaces.FilterInterface(过滤方法具有指针接收器)但是改变时行_ = filtermap.AddFilter(&fieldfilter)
它的作品。发生什么事了?这是为什么?