Сканирование ввода
Читайте форматированный ввод
«Сканирование ввода» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Чтение входных данных с помощью fmt
Пакет fmt умеет не только выводить значения, но и читать их. Функции сканирования разбирают текст и записывают его в переменные соответствующих типов.
Они являются зеркальным отражением функций вывода.
package main
import "fmt"
func main() {
var n int
fmt.Sscan("42", &n)
fmt.Println(n + 1)
}Требуются указатели
Функции сканирования должны сохранить результат, поэтому передавайте адрес каждой переменной с помощью &.
Забыть & — самая распространённая ошибка при сканировании.
package main
import "fmt"
func main() {
var a, b int
fmt.Sscan("3 4", &a, &b)
fmt.Println(a + b)
}Sscan разделяет данные по пробелам
fmt.Sscan считывает разделённые пробелами значения из строки в несколько переменных, определяя тип по каждому указателю.
package main
import "fmt"
func main() {
var name string
var age int
fmt.Sscan("Ada 36", &name, &age)
fmt.Println(name, age)
}Sscanf использует формат
fmt.Sscanf разбирает данные согласно строке формата, подобно тому как Printf делает это в обратную сторону. Литералы в формате должны совпадать с входными данными.
package main
import "fmt"
func main() {
var h, m int
fmt.Sscanf("09:05", "%d:%d", &h, &m)
fmt.Println(h, m)
}Проверка количества считанных значений
Функции сканирования возвращают количество успешно разобранных элементов и ошибку. Проверьте это количество, чтобы узнать, полностью ли выполнен разбор.
package main
import "fmt"
func main() {
var a, b int
count, _ := fmt.Sscan("7", &a, &b)
fmt.Println("parsed:", count)
}Обработка ошибок разбора
Если входные данные не соответствуют ожидаемому типу, возвращается ошибка. При работе с реальными входными данными всегда проверяйте её.
package main
import "fmt"
func main() {
var n int
_, err := fmt.Sscan("notanumber", &n)
if err != nil {
fmt.Println("error:", err)
}
}Разбор смешанных типов
За один вызов можно считать несколько разных типов. Тип каждого указателя определяет, как будет разобран соответствующий фрагмент.
package main
import "fmt"
func main() {
var word string
var price float64
var ok bool
fmt.Sscan("apple 1.50 true", &word, &price, &ok)
fmt.Println(word, price, ok)
}Sscanf с буквальным текстом
Sscanf отлично подходит для фиксированных форматов, например координат или пар «ключ—значение», где знаки пунктуации разделяют числа.
package main
import "fmt"
func main() {
var x, y int
fmt.Sscanf("(3,8)", "(%d,%d)", &x, &y)
fmt.Println(x, y)
}Чтение чисел с плавающей точкой
Используйте %f в Sscanf или *float64 в Sscan, чтобы считывать десятичные числа.
package main
import "fmt"
func main() {
var temp float64
fmt.Sscanf("21.5C", "%fC", &temp)
fmt.Println(temp)
}Сканирование и стандартный ввод
fmt.Scan и fmt.Scanf считывают данные из стандартного ввода так же, как Sscan считывает их из строки. Правила разбора одинаковы, различается только источник.
package main
import "fmt"
func main() {
line := "100 200"
var a, b int
fmt.Sscan(line, &a, &b)
fmt.Println(a * b)
}Небольшой разборщик
Объедините сканирование с вычислением, чтобы разобрать запись и получить результат.
package main
import "fmt"
func main() {
var name string
var qty int
var unit float64
fmt.Sscanf("pen 3 1.25", "%s %d %f", &name, &qty, &unit)
fmt.Printf("%s total: $%.2f\n", name, float64(qty)*unit)
}Быстрая проверка
Что нужно передать функции сканирования, чтобы сохранить результат?
Итоги: сканирование входных данных
Вы научились читать форматированные входные данные:
Sscanразделяет данные по пробельным символам;Sscanfследует строке формата.- Передавайте указатели с помощью
&для каждой целевой переменной. - Проверяйте возвращённые количество и ошибку, чтобы обнаруживать некорректные входные данные.
package main
import "fmt"
func main() {
var d, mo, y int
fmt.Sscanf("30/05/2026", "%d/%d/%d", &d, &mo, &y)
fmt.Println(y, mo, d)
}Часто задаваемые вопросы
Урок «Сканирование ввода» бесплатный?
Да — полный текст урока «Сканирование ввода» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Сканирование ввода»?
Читайте форматированный ввод Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Сканирование ввода»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Глаголы Printf
- Sprintf и Fprintf
- Интерфейс Stringer
- Сканирование ввода