Go Academy · Урок

Вспомогательные функции io

Copy, TeeReader и MultiWriter

Урок 3 из 413 шагов

«Вспомогательные функции io» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Набор инструментов io

Пакет io содержит небольшие, но мощные вспомогательные средства для объединения читателей и писателей: Copy, TeeReader, MultiWriter и другие.

io.Copy

io.Copy(dst, src) передаёт все байты из читателя писателю и возвращает их количество.

package main

import (
	"fmt"
	"io"
	"os"
	"strings"
)

func main() {
	n, _ := io.Copy(os.Stdout, strings.NewReader("copied\n"))
	fmt.Println("bytes:", n)
}

io.CopyN

io.CopyN(dst, src, n) копирует ровно n байт — это удобно для чтения префикса известной длины.

package main

import (
	"io"
	"os"
	"strings"
)

func main() {
	io.CopyN(os.Stdout, strings.NewReader("abcdef"), 3)
	os.Stdout.WriteString("\n")
}

io.MultiWriter

io.MultiWriter одновременно направляет одну запись нескольким писателям — подобно команде Unix tee.

package main

import (
	"bytes"
	"fmt"
	"io"
	"os"
)

func main() {
	var buf bytes.Buffer
	w := io.MultiWriter(os.Stdout, &buf)
	io.WriteString(w, "to both\n")
	fmt.Println("buffer copy:", buf.String())
}

io.TeeReader

io.TeeReader(r, w) возвращает читатель, который копирует всё прочитанное в w — идеально подходит для журналирования или хеширования данных по мере их прохождения.

package main

import (
	"bytes"
	"fmt"
	"io"
	"strings"
)

func main() {
	var spy bytes.Buffer
	tee := io.TeeReader(strings.NewReader("stream"), &spy)
	io.ReadAll(tee)
	fmt.Println("observed:", spy.String())
}

io.MultiReader

io.MultiReader объединяет несколько читателей в один непрерывный поток.

package main

import (
	"fmt"
	"io"
	"strings"
)

func main() {
	r := io.MultiReader(strings.NewReader("Hello, "), strings.NewReader("World"))
	data, _ := io.ReadAll(r)
	fmt.Println(string(data))
}

io.Discard

io.Discard — это писатель, который отбрасывает всё полученное; он полезен, чтобы вычитать ненужные данные из читателя.

package main

import (
	"fmt"
	"io"
	"strings"
)

func main() {
	n, _ := io.Copy(io.Discard, strings.NewReader("ignored"))
	fmt.Println("discarded:", n, "bytes")
}

Хеширование с помощью TeeReader

Классический приём: читайте поток для его основной задачи, пока TeeReader передаёт те же байты хеш-функции, чтобы вычислить контрольную сумму за один проход.

io.Pipe

io.Pipe соединяет писателя с читателем в памяти, часто между горутинами, для потоковой обработки по схемам «производитель — потребитель».

Выбор подходящего средства

  • Перемещение данных: Copy / CopyN
  • Дублирование вывода: MultiWriter
  • Наблюдение за входными данными: TeeReader
  • Объединение входных данных: MultiReader
  • Вычитывание входных данных: Discard

Композиция

Все эти средства работают с io.Reader/io.Writer, поэтому их можно свободно вкладывать и объединять в цепочки, создавая сложные конвейеры из небольших компонентов.

Быстрая проверка

Проверьте свои знания об утилитах io.

Итоги

Вы изучили вспомогательные средства io.

  • Copy / CopyN передают данные потоком
  • MultiWriter дублирует вывод
  • TeeReader наблюдает за входными данными
  • MultiReader объединяет, а Discard вычитывает данные
  • Все они объединяются с помощью интерфейсов Reader/Writer
Можно начать бесплатно

Изучай Go с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Вспомогательные функции io» бесплатный?

Да — полный текст урока «Вспомогательные функции io» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Вспомогательные функции io»?

Copy, TeeReader и MultiWriter Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Вспомогательные функции io»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Интерфейс Reader
  2. Интерфейс Writer
  3. Вспомогательные функции io
  4. Реализация собственных средств чтения
← Назад к Go Academy