Go за Прикладом: Читання файлів

Work in Progress / Сайт в процесі розробки

Одними з базових типів задач що використовуються Go-програмами є запис та читання файлів. І в першу чергу, ми познайомимось з читанням файлів.

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))

Але зазвичай вам потрібно трошка більше контролю над тим як і які частини файлу будуть читатись. Для таких задач, почніть з Open (відкривання) файлу щоб отримати значення 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 байт: %s\n", n1, string(b1))

Ви також можете Seek (перемотати) до первного положення в файлі і Read (прочитати) звідти.

    o2, err := f.Seek(6, 0)
    check(err)
    b2 := make([]byte, 2)
    n2, err := f.Read(b2)
    check(err)
    fmt.Printf("%d байт @ %d: %s\n", n2, o2, string(b2))

Пакет 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 байт @ %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 байт: %s\n", string(b4))

Закривайте файл коли ви з ним закінчили (зазвичай це роблять відразу після відкриття за допомогою defer).

    f.Close()
}
$ echo "hello" > /tmp/dat
$ echo "go" >>   /tmp/dat
$ go run reading-files.go
hello
go
5 байт: hello
2 байт @ 6: go
2 байт @ 6: go
5 байт: hello

Далі, ми побачимо як записувати файли.

Наступний приклад: Запис файлів.