Golang接口不需要导入?

时间:2013-07-09 22:06:58

标签: interface go

如果您查看File结构,则其Read()Write()函数与io.Writerio.Reader interface {完全相同{1}}和Read()个函数。但是Write()包中没有找到包io(未导入)。这是否意味着根本不需要导入接口才能使用?只要File定义与接口相同,就可以暗示它是Read()io.Writer接口的一部分?

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

os:http://golang.org/pkg/os/

2 个答案:

答案 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{}