【问题标题】:Golang interfaces do not need to be imported?Golang接口不需要导入?
【发布时间】:2013-07-09 22:06:57
【问题描述】:

如果你看一下File 结构,它有一个Read()Write() 函数,与io.Writerio.Reader 接口Read()Write() 函数完全相同。但是io 包在File 包中找不到(未导入)。这是否意味着根本不需要导入接口来使用?只要Read() 定义与接口相同,就可以暗示它是io.Writerio.Reader 接口的一部分?

io:http://golang.org/pkg/io/

操作系统:http://golang.org/pkg/os/

【问题讨论】:

    标签: interface go


    【解决方案1】:

    os不导入包io,因为包os中没有使用io.Reader接口。

    *File 类型恰好实现了io.Reader,因为它有一个带有正确签名的Read 方法。这种实现关系是隐式的,既不需要也不可能使这个显式(例如,在Java中implements ISomeThing)。

    您问:“这是否意味着根本不需要导入接口来使用?”正式的答案是:当然不是!如果你想使用io.Reader,你必须import "io"

    但是实现/满足一个接口不是使用这个接口:任何类型都可以通过拥有正确的方法来实现任何接口(即使是未来尚未发明的接口)。

    【讨论】:

      【解决方案2】:

      导出的实体是常量、变量和类型。使用它们,即。要引用此类导出的实体,必须使用它们的 [qualified] 名称,而限定符是导出它们的包的基本名称。这也意味着使用此类包的导入语句。 IOW,在文件范围内绑定导出的实体是[严格] 显式。没有导入 == 无法访问导出的内容。

      OTOH,实现一个接口是specified隐式

      一个类型实现了包含其方法的任何子集的任何接口,因此可以实现几个不同的接口。例如,所有类型都实现空接口:

      interface{}
      

      【讨论】:

        猜你喜欢
        • 2016-12-29
        • 2015-06-11
        • 2018-07-02
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多