2019-10-11 13:42:25 +03:00

87 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Чтение и запись файлов это базовая задача, необходимая
// для решения множества задач. Для начала мы рассмотрим
// несколько примеров чтения файлов.
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()
}