如果您查看File
结构,则其Read()
和Write()
函数与io.Writer
和io.Reader
interface {完全相同{1}}和Read()
个函数。但是Write()
包中没有找到包io
(未导入)。这是否意味着根本不需要导入接口才能使用?只要File
定义与接口相同,就可以暗示它是Read()
或io.Writer
接口的一部分?
答案 0 :(得分:10)
程序包os
不会导入程序包io
,因为程序包io.Reader
中未使用os
接口。
类型*File
恰好实现io.Reader
,因为它具有带有正确签名的Read
方法。这实现了关系隐式,并且既不需要也不可能使 explicite (例如在Java中使用implements ISomeThing
)。
你问:“这是否意味着根本不需要导入接口才能使用?”而正式答案是:当然不是!如果您想使用io.Reader
,则必须import "io"
。
但是实现/满足接口是而不是使用这个接口:任何类型只需要使用正确的方法就可以实现任何接口(甚至是未发明的接口)。
答案 1 :(得分:1)
导出的实体是常量,变量和类型。使用它们,即。要引用这样的导出实体,必须使用它们的[qualified]名称,而限定符是导出它们的包的基本名称。这也意味着使用此类包的import语句。 IOW,在文件范围内绑定导出的实体是[严格] 显式。没有导入==无法访问导出的内容。
OTOH,实现接口specified是隐式的:
类型实现包含其方法的任何子集的任何接口,因此可以实现几个不同的接口。例如,所有类型都实现空接口:
interface{}