Go Academy · Урок

Сканеры

Читайте построчно

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

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

Что такое bufio.Scanner

bufio.Scanner — самый простой способ читать входные данные по одному токену, чаще всего построчно.

Он скрывает детали буферизации и обработки разделителей, а также автоматически удаляет завершающий символ новой строки.

Сканирование строк

Создайте сканер, затем выполняйте цикл с Scan(), который возвращает false в конце. Читайте текущий токен с помощью Text().

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("one\ntwo\nthree"))
	for s.Scan() {
		fmt.Println("line:", s.Text())
	}
}

Сканирование слов

Задайте функцию разделения с помощью Split(bufio.ScanWords), чтобы разбивать данные по пробельным символам, а не по строкам.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("the quick brown fox"))
	s.Split(bufio.ScanWords)
	for s.Scan() {
		fmt.Println(s.Text())
	}
}

Подсчёт токенов

Сканеры делают подсчёт очень простым. Здесь мы считаем слова.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("a b c d e"))
	s.Split(bufio.ScanWords)
	count := 0
	for s.Scan() {
		count++
	}
	fmt.Println("words:", count)
}

Bytes и текст

Text() возвращает копию строки. Bytes() возвращает исходный срез, который используется повторно при следующем вызове Scan() — скопируйте его, если хотите сохранить.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("data"))
	s.Scan()
	fmt.Println(len(s.Bytes()), "bytes")
}

Сканирование рун

bufio.ScanRunes разбивает входные данные на руны UTF-8, по одному токену на каждый символ.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("Gö"))
	s.Split(bufio.ScanRunes)
	for s.Scan() {
		fmt.Printf("[%s]", s.Text())
	}
	fmt.Println()
}

Проверка ошибок

Возврат false из Scan() может означать EOF или ошибку. После цикла вызовите s.Err(), чтобы различить эти случаи.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("ok\nfine"))
	for s.Scan() {
		fmt.Println(s.Text())
	}
	if err := s.Err(); err != nil {
		fmt.Println("error:", err)
	}
}

Ограничение размера токена

По умолчанию размер одного токена не может превышать bufio.MaxScanTokenSize (64 КБ). Слишком длинная строка приводит к остановке Scan() с ошибкой.

Увеличение буфера

Используйте Buffer(buf, max), чтобы разрешить токены большего размера. Передайте начальный буфер и максимальный размер.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("long line here"))
	buf := make([]byte, 0, 1024)
	s.Buffer(buf, 1024*1024)
	for s.Scan() {
		fmt.Println(s.Text())
	}
}

Пользовательские функции разделения

Функция разделения имеет сигнатуру func(data []byte, atEOF bool) (advance int, token []byte, err error). Можно разделять данные по запятым, по фиксированной ширине — как угодно.

Scanner и Reader

  • Scanner: простой, работает с токенами-строками и токенами-словами, автоматически удаляет символы новой строки, ограничение по умолчанию — 64 КБ
  • Reader: полный контроль, ограничений по размеру нет, разделители обрабатываются вручную

Сначала выбирайте Scanner; переходите к Reader, когда требуется больше возможностей.

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

Проверьте свои знания о сканерах.

Итоги

Вы научились читать входные данные по одному токену с помощью bufio.Scanner.

  • Цикл с Scan() + Text()/Bytes()
  • Split с ScanLines/ScanWords/ScanRunes
  • Проверка Err() после цикла
  • Использование Buffer для токенов размером более 64 КБ
Можно начать бесплатно

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

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

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

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

Урок «Сканеры» бесплатный?

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

Чему я научусь в уроке «Сканеры»?

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

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

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

Сколько времени занимает урок «Сканеры»?

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

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

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

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

  1. Буферизованные средства чтения
  2. Сканеры
  3. Буферизованные средства записи
  4. Потоковая обработка больших файлов
← Назад к Go Academy