Чтение файлов на Go

GolangGolangBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Лабораторная работа по чтению файлов предназначена для того, чтобы помочь вам научиться читать файлы на Go. Вы научитесь читать файлы различными способами, в том числе читать весь файл, читать определенные части файла и использовать пакет bufio для чтения файлов.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/FileOperationsGroup(["File Operations"]) go/FileOperationsGroup -.-> go/reading_files("Reading Files") subgraph Lab Skills go/reading_files -.-> lab-15499{{"Чтение файлов на Go"}} end

Чтение файлов

В вашей программе на Go вам нужно читать файлы и выполнять различные операции с данными в файле.

  • Вам следует быть знакомым с основными концепциями программирования на Go.
  • На вашем компьютере должен быть установлен Go.
$ 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

## Далее мы рассмотрим запись в файлы.

Ниже представлен полный код:

// Чтение и запись файлов - это базовые задачи, необходимые для
// многих программ на Go. Сначала мы рассмотрим некоторые примеры
// чтения файлов.

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

// При чтении файлов необходимо проверять большинство вызовов на ошибки.
// Эта вспомогательная функция упростит наши проверки ошибок ниже.
func check(e error) {
	if e!= nil {
		panic(e)
	}
}

func main() {

	// Возможно, самая базовая задача чтения файла - это
	// загрузка всего содержимого файла в память.
	dat, err := os.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[: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 байт @ %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 байт @ %d: %s\n", n3, o3, string(b3))

	// В Go нет встроенной функции для возврата в начало файла,
	// но `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))

	// Закройте файл, когда закончите (обычно это должно
	// быть запланировано сразу после `Open` с использованием
	// `defer`).
	f.Close()
}

Резюме

В этой лабораторной работе вы узнали, как читать файлы на Go с использованием различных методов. Вы узнали, как читать весь файл, определенные части файла и использовать пакет bufio для чтения файлов. С этими навыками вы теперь можете читать файлы в своих программах на Go и выполнять различные операции с данными в файле.