Язык программирования Go: File vs FileReader

Многие из нас сталкивались с задачей чтения даных из файла, задача сама по себе тривиальна, но её реализация, это как модно сегодня говорить «печалька». Возьмем хотябы Java: для этих целей Java SE предоставляет целый набор классов и нтерфейсов java.io.Reader, java.io.File, java.io.FileReader, java.io.BufferedReader.  В самом плохом сценарии вызов некоего метода:

void parseData(Reader reader)
{
}

Оборачивается в:

obj.parseData(new BufferedReader(new FileReader(new File("file.txt"))))

«Печалька» и скукотища😦

Изучая Go я также решил протестировать его на задачу «чтения из файла»,  тип File я нашел довольно быстро (хотя странно что он распологается в пакете os, а не io как я ожидал).  Затем настал черед FileReader’a.  Тут уж пришлось попотеть, «облазив» практически все пакеты, я так и не нашел такой тип — небольшой ступор. И только прочитав про концепцию интерфейсов в Go я понял, что тип File уже сам реализует интефейс Reader (!wow очень элегантно!). Код чтения данных уже выглядит иначе:

package main
import (
"os"
"io"
}

func readData(io.Reader r){
}
func main(){
/** открываем файл*/
r,_ := os.Open("test.html")
/** читаем данные*/
readData(r)
}

Несомненно и в Go существуют отпимизации в виде bytes.BufferedReader, оборачивающие оригинальный reader, но это уже частности.

Кстати насчёт интерфейсов, как я понимаю в Go интерфейсы это всего лишь логическая группировка методов. То есть можно объявить интерфейс, как в случае с io.Reader

type Reader interface {
    Read(p []byte) (n int, err os.Error)
}

Но сами интерфейсы явно не наследуются, любой тип реализовавший метод

Read(p []byte) (n int, err os.Error)

уже считается унаследовавшим-и-реализовавшим интерфейс io.Reader, собственно как это произошло с типом os.File

Отмечено

6 ответов на “Язык программирования Go: File vs FileReader

  1. Опять хочется сказать «а вот в Ruby …», но не буду оффтопить🙂
    Рассказывай, интересно.

    • Алексей, нет уж, рассказывай🙂 Я тоже жажду обогощения, знаниями!

      • В Ruby функция открытия файла принимает блок. То есть выполняет какие-то действия открыв файл, а после закрывает его.

        Например:

        File.open(‘README’, ‘r’){|f| f.lines.reverse_each{|l| puts l} }

        Выводит файл построчно задом наперед и закрывает его после этого.

      • А как бы с массивом байтов, кэшируется ли этот массив типом File ?

  2. Есть bytes,

    File.open(‘README’, ‘rb’){|f| f.bytes.reverse_each{|b| puts b}}

    А так же есть binread:
    http://ruby-doc.org/core-1.9.3/IO.html#method-c-binread

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: