如果你看一下File结构体,它的Read()andWrite()函数与io.Writerandio.Reader接口Read()和Write()函数完全相同。但是在包io中找不到File包(未导入)。这是否意味着根本不必导入接口即可使用?只要Read()定义与接口相同,就可以暗示它是io.Writerorio.Reader接口的一部分?io:http : //golang.org/pkg/io/操作系统:http : //golang.org/pkg/os/
2 回答
一只斗牛犬
TA贡献1784条经验 获得超2个赞
包os
不导入包,io
因为io.Reader
接口没有在包中使用os
。
该类型*File
碰巧实现了,io.Reader
因为它有一个Read
具有正确签名的方法。这个实现关系是隐式的,既不需要也不可能使这个显式(例如在 Java 中使用implements ISomeThing
)。
你问:“这是否意味着接口根本不需要导入就可以使用?” 正式的答案是:当然不是!如果你想使用io.Reader
你必须import "io"
。
但是实现/满足一个接口并不是对这个接口的使用:任何类型都可以通过拥有正确的方法来实现任何接口(即使是未来尚未发明的接口)。
幕布斯7119047
TA贡献1794条经验 获得超8个赞
导出的实体是常量、变量和类型。使用它们,即。要引用这样的导出实体,必须使用它们的 [qualified] 名称,而限定符是导出它们的包的基本名称。这也意味着使用此类包的导入语句。IOW,在文件范围内绑定导出的实体是 [严格]显式的。没有导入 == 无法访问导出的东西。
OTOH,实现接口被指定为隐式:
一个类型实现了包含其方法的任何子集的任何接口,因此可以实现几个不同的接口。例如,所有类型都实现空接口:
interface{}
- 2 回答
- 0 关注
- 228 浏览
添加回答
举报
0/150
提交
取消