// Чтение и запись файлов это базовая задача, необходимая // для решения множества задач. Для начала мы рассмотрим // несколько примеров чтения файлов. package main import ( "bufio" "fmt" "io" "io/ioutil" "os" ) // Чтение файлов требует проверок множества вызовов на // наличие ошибок. Эта функция-хелпер поможет нам // обрабатывать ошибки в одном месте. func check(e error) { if e != nil { panic(e) } } func main() { // Возможно, самая основная задача чтения файлов - // это сохранение всего содержимого файла в памяти. dat, err := ioutil.ReadFile("/tmp/dat") check(err) fmt.Print(string(dat)) // Вам часто может потребоваться больший контроль // над тем, как и какие части файла читаются. Для // решения этих задач начните с открытия файла, // чтобы получить значение `os.File`.. f, err := os.Open("/tmp/dat") check(err) // Прочитаем несколько байт с начала файла. Будет // прочитано первые 5 байт, но также выведем, // сколько фактически было прочитано. b1 := make([]byte, 5) n1, err := f.Read(b1) check(err) fmt.Printf("%d bytes: %s\n", n1, string(b1[:n1])) // Вы так же можете получить конкретное место файла // с помощью `Seek` и выполнить `Read` оттуда. o2, err := f.Seek(6, 0) check(err) b2 := make([]byte, 2) n2, err := f.Read(b2) check(err) fmt.Printf("%d bytes @ %d: ", n2, o2) fmt.Printf("%v\n", string(b2[:n2])) // Пакет `io` предоставляет некоторые функции, которые // могут быть полезны для чтения файлов. Например, // чтение, подобное приведенному выше, может быть // более надежно реализовано с помощью `ReadAtLeast`. o3, err := f.Seek(6, 0) check(err) b3 := make([]byte, 2) n3, err := io.ReadAtLeast(f, b3, 2) check(err) fmt.Printf("%d bytes @ %d: %s\n", n3, o3, string(b3)) // Тут нет встроенной перемотки назад, но можно // использовать `Seek(0, 0)` для этого. _, err = f.Seek(0, 0) check(err) // В пакете `bufio` реализован буферизованный ридер, // который может быть полезен из-за своей эффективности // при большом количестве небольших операций чтения, и // из-за наличия дополнительных методов чтения, которые // он предоставляет. r4 := bufio.NewReader(f) b4, err := r4.Peek(5) check(err) fmt.Printf("5 bytes: %s\n", string(b4)) // Закройте файл, когда вы закончите использовать его // (обычно закрытие с `defer`'ом делается сразу после открытия). f.Close() }