2013-07-09 3 views
2

Если вы посмотрите на File STRUCT имеет функцию Read() и Write(), которое точно так же, как и io.Writerio.Reader интерфейс Read() и Write() функций. Но пакет io нет, где можно найти в пакете File (не импортируется). Означает ли это, что интерфейсы вообще не должны импортироваться для использования? До тех пор, пока определение Read() совпадает с интерфейсом, можно сказать, что оно является частью интерфейса io.Writer или io.Reader?Интерфейсы Golang не нужно импортировать?

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

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

ответ

10

Пакет os не импортировать пакет io как интерфейс io.Reader не используется в пакете os.

Тип *File имеет значение io.Reader, так как у него есть метод Read с правильной подписью. Это реализует отношение неявное и не нужно и не нужно это делать explicite (например, как на Java с implements ISomeThing).

Вы спросили: «Означает ли это, что интерфейсы вообще не должны импортироваться для использования?» и формальный ответ: Конечно не! Если вы хотите использовать io.Reader, вы должны import "io".

Но реализация/удовлетворение интерфейса не Использование этого интерфейса: Любой тип реализует любой интерфейс (даже будущие, которые не были изобретены), просто используя правильные методы.

1

экспортируемые объекты являются константы, переменные и типы. Использовать их, т.е. чтобы ссылаться на такие экспортируемые объекты, нужно использовать их [квалифицированное] имя, а квалификатор - это базовое имя пакета, который их экспортирует. Это также подразумевает использование инструкции импорта такого пакета. IOW, привязка экспортируемых объектов в области файла [строго] явно. Нет import == нет доступа к экспортированным материалам.

Ото, реализации интерфейса является specifiedбыть неявным:

Тип реализует любой интерфейс, включающий любое подмножество его методов и, следовательно, может реализовывать несколько различных интерфейсов. Например, все виды реализации пустой интерфейс:

interface{} 
Смежные вопросы