我有一个关于数据类型/结构能够满足函数调用中预期的另一种类型的要求的问题。
在用Go编写的RSS和Atom Feed处理程序的feed.go中,有一个New
辅助函数,它将ChannelHandlerFunc作为第三个参数,您可以看到它作为参数传递给a NewDatabaseChannelHandler
,它返回一个DatabaseHandler,如下所示。 DatabaseHandler中嵌入了ChannelHandler。您可以在New
函数中看到NewDatabaseChannelHandler(即DatabaseHandler)的返回值作为第3个参数传递给NewWithHandlers
。但是,如您所见,NewWithHandlers
需要ChannelHandler作为第三个参数。
问题:为什么NewWithHandlers
在DatabaseHandler
作为第三个参数的返回值传递NewDatabaseChannelHandler
时不会抛出错误。 NewWithHandlers
期望ChannelHandler不是DatabaseHandler?
func New(cachetimeout int, enforcecachelimit bool, ch ChannelHandlerFunc, ih ItemHandlerFunc) *Feed {
db := NewDatabase()
f := NewWithHandlers(cachetimeout, enforcecachelimit, NewDatabaseChannelHandler(db, ch), NewDatabaseItemHandler(db, ih))
f.database = db
return f
}
然后NewWithHandlers接受ChannelHandler作为第三个参数
// NewWithHandler creates a new feed with handlers
// People should use this approach from now on
func NewWithHandlers(cachetimeout int, enforcecachelimit bool, ch ChannelHandler, ih ItemHandler) *Feed {
v := new(Feed)
v.CacheTimeout = cachetimeout
v.EnforceCacheLimit = enforcecachelimit
v.Type = "none"
v.channelHandler = ch
v.itemHandler = ih
return v
}
此file是NewDatabaseChannelHandler
的源代码但是,NewDatabaseChannelHandler不返回ChannelHandler,它返回一个DatabaseHandler
func NewDatabaseChannelHandler(db *database, chanhandler ChannelHandler) ChannelHandler {
database := new(databaseHandler)
database.db = db
database.chanhandler = chanhandler
return database
}
type databaseHandler struct {
db *database
itemhandler ItemHandler
chanhandler ChannelHandler
}
答案 0 :(得分:1)
DatabaseHandler
使用此方法满足ChannelHandler
接口:
func (d *databaseHandler) ProcessChannels(f *Feed, ch []*Channel)
界面要求:
type ChannelHandler interface {
ProcessChannels(f *Feed, newchannels []*Channel)
}