我在Go中有一个接口类型,它使用自己的嵌套接口定义了一些方法。像这样:
type Store interface {
Pack(key string) interface {
Put(r io.Reader) (int, error)
io.Closer
}
// ... other stuff ...
}
现在,我定义了另一个接口,让它称之为Packer,它匹配Pack方法返回的内容,如下所示:
type Packer interface {
Put(r io.Reader) (int, error)
io.Closer
}
然后我可以实现两种商店。一个使用Pack方法返回Packer,另一个使用Pack返回显式接口类型:
func (s *storeTypeA) Pack(key string) Packer { ... }
func (s *storeTypeB) Pack(key string) interface {
Put(r io.Reader) (int, error)
io.Closer
} { ... }
现在只有一个问题。 storeTypeA
实际上不再符合Store界面。如果我尝试将其作为商店传递出去,我会收到此错误:
prog.go: cannot use storeTypeA literal (type *storeTypeA) as type Store in assignment:
*storeTypeA does not implement Store (wrong type for Pack method)
have Pack(string) Packer
want Pack(string) interface { Close() error; Put(io.Reader) (int, error) }
我不明白的是,Packer界面 完全等于interface { Close() error; Put(io.Reader) (int, error) }
。那么为什么会出错?
任何想法如何解决这个问题?
我想明显的事情就是没有嵌套接口,但我有点好奇为什么这应该是一个问题。我是这样做的,因为我希望能够在我提供商店本身的包的外部定义接口。