Go

时间:2016-01-22 21:30:00

标签: go interface

我在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) }。那么为什么会出错?

任何想法如何解决这个问题?

我想明显的事情就是没有嵌套接口,但我有点好奇为什么这应该是一个问题。我是这样做的,因为我希望能够在我提供商店本身的包的外部定义接口。

0 个答案:

没有答案