Сканеры
Читайте построчно
«Сканеры» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Буферизованные средства чтения
- Сканеры
- Буферизованные средства записи
- Потоковая обработка больших файлов