Golang接口不需要导入吗?

3
如果您查看File结构体,它有一个Read()Write()函数,这与io.Writerio.Reader接口的Read()Write()函数完全相同。但是,在File包中找不到io包(未导入)。这是否意味着接口根本不需要导入即可使用?只要Read()定义与接口相同,就可以暗示它是io.Writerio.Reader接口的一部分吗?
io:http://golang.org/pkg/io/ os:http://golang.org/pkg/os/
2个回答

12

由于包os中未使用io.Reader接口,因此不会导入io包。

类型*File刚好实现了io.Reader接口,因为它具有正确签名的Read方法。这种实现关系是隐式的,不需要也无法将其显式化(例如在Java中使用implements ISomeThing)。

你问道:"这是否意味着接口根本不需要被导入就可以使用?" 正式的答案当然是:不是!如果要使用io.Reader,必须import "io"

但实现/满足接口并不是使用该接口:任何类型只要拥有正确的方法,就可以实现任何接口(甚至是尚未发明的未来接口)。


1
导出的实体是常量、变量和类型。要使用它们,即引用这些导出实体,必须使用它们的[限定]名称,而修饰符是导出它们的包的基本名称。这也意味着使用这种包的导入语句。换句话说,在文件范围内绑定导出实体是[严格]明确的。没有导入就没有访问导出的内容。
另一方面,实现接口被认为是隐含的:
类型实现包含其任何子集的方法的任何接口,因此可以实现几个不同的接口。例如,所有类型都实现空接口:
interface{}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接