【发布时间】:2013-07-09 22:06:57
【问题描述】:
如果你看一下File 结构,它有一个Read() 和Write() 函数,与io.Writer 和io.Reader 接口Read() 和Write() 函数完全相同。但是io 包在File 包中找不到(未导入)。这是否意味着根本不需要导入接口来使用?只要Read() 定义与接口相同,就可以暗示它是io.Writer 或io.Reader 接口的一部分?
【问题讨论】:
如果你看一下File 结构,它有一个Read() 和Write() 函数,与io.Writer 和io.Reader 接口Read() 和Write() 函数完全相同。但是io 包在File 包中找不到(未导入)。这是否意味着根本不需要导入接口来使用?只要Read() 定义与接口相同,就可以暗示它是io.Writer 或io.Reader 接口的一部分?
【问题讨论】:
包os不导入包io,因为包os中没有使用io.Reader接口。
*File 类型恰好实现了io.Reader,因为它有一个带有正确签名的Read 方法。这种实现关系是隐式的,既不需要也不可能使这个显式(例如,在Java中implements ISomeThing)。
您问:“这是否意味着根本不需要导入接口来使用?”正式的答案是:当然不是!如果你想使用io.Reader,你必须import "io"。
但是实现/满足一个接口不是使用这个接口:任何类型都可以通过拥有正确的方法来实现任何接口(即使是未来尚未发明的接口)。
【讨论】:
导出的实体是常量、变量和类型。使用它们,即。要引用此类导出的实体,必须使用它们的 [qualified] 名称,而限定符是导出它们的包的基本名称。这也意味着使用此类包的导入语句。 IOW,在文件范围内绑定导出的实体是[严格] 显式。没有导入 == 无法访问导出的内容。
OTOH,实现一个接口是specified 是隐式:
一个类型实现了包含其方法的任何子集的任何接口,因此可以实现几个不同的接口。例如,所有类型都实现空接口:
interface{}
【讨论】: