Базовый ввод данных: fmt.Scanln() для идеального пользователя

Краткое описание

Знакомимся с простейшим способом получения данных от пользователя через fmt.Scanln(). Изучаем, как считывать целые числа, строки и вещественные значения. Важно: урок предполагает идеального пользователя, который всегда вводит корректные данные. Обработка ошибок — тема для следующих уроков.

Базовый синтаксис

var value int
fmt.Scanln(&value)  // ⚠️ Обязателен амперсанд (&)

Ключевой момент: перед переменной ставится & (амперсанд).

Примеры для разных типов

Целые числа

var value int
fmt.Print("Введите число: ")
fmt.Scanln(&value)
fmt.Printf("Вы ввели: %d\n", value)

// Можно выполнять операции
result := value * 2
fmt.Printf("Умноженное на 2: %d\n", result)

Строки

var name string
fmt.Print("Введите имя: ")
fmt.Scanln(&name)
fmt.Printf("Привет, %s!\n", name)

Вещественные числа

var height float64
fmt.Print("Введите рост: ")
fmt.Scanln(&height)
fmt.Printf("Рост: %.2f, удвоенный: %.2f\n", height, height*2.0)

Логические значения

var flag bool
fmt.Print("Введите true или false: ")
fmt.Scanln(&flag)
fmt.Printf("Значение: %t\n", flag)

Полный пример

package main

import "fmt"

func main() {
    // Целое число
    var value int
    fmt.Print("Введите value: ")
    fmt.Scanln(&value)
    fmt.Printf("value = %d, умноженное на 2 = %d\n", value, value*2)
    
    // Строка
    var name string
    fmt.Print("Введите name: ")
    fmt.Scanln(&name)
    fmt.Printf("name = %s\n", name)
    
    // Вещественное число
    var height float64
    fmt.Print("Введите height: ")
    fmt.Scanln(&height)
    fmt.Printf("height = %.2f, умноженное на 2 = %.2f\n", height, height*2.0)
}

Важные моменты

1. Амперсанд (&) обязателен

fmt.Scanln(&value)  // ✅ Правильно
// fmt.Scanln(value)  // ❌ Ошибка компиляции

2. Приглашение к вводу

Всегда показывайте пользователю, что от него ожидается:

fmt.Print("Введите число: ")  // Приглашение
fmt.Scanln(&value)             // Ввод

3. Enter/Return завершает ввод

Пользователь вводит данные и нажимает Enter для подтверждения.

4. Работает для базовых типов

  • int, int8, int16, int32, int64
  • uint, uint8, uint16, uint32, uint64
  • float32, float64
  • string
  • bool

5. Предположение об идеальном пользователе

Этот урок предполагает, что:

  • Если просим число — вводят число
  • Если просим строку — вводят строку
  • Никаких некорректных данных

6. Обработка ошибок — позже

Реальные приложения требуют проверки ввода. Это сложная тема для следующих уроков.

Типичные ошибки

Ошибка #1: Забыли амперсанд

var value int
fmt.Scanln(value)  // ❌ Ошибка компиляции

Ошибка #2: Нет приглашения к вводу

// ❌ Плохо (непонятно, что вводить)
var value int
fmt.Scanln(&value)

// ✅ Хорошо (понятно)
var value int
fmt.Print("Введите число: ")
fmt.Scanln(&value)

Ошибка #3: Неправильный спецификатор вывода

var name string
fmt.Scanln(&name)
fmt.Printf("Имя: %d\n", name)  // ❌ %d для строки

// ✅ Правильно
fmt.Printf("Имя: %s\n", name)

Best Practices

1. Всегда показывайте приглашение

fmt.Print("Введите возраст: ")
fmt.Scanln(&age)

2. Добавляйте пробел в конце приглашения

fmt.Print("Введите число: ")  // ✅ Пробел после двоеточия

3. Используйте понятные имена переменных

var userName string  // ✅ Понятно
var x string         // ❌ Непонятно

4. Форматируйте вывод

fmt.Printf("Вы ввели: %d\n", value)  // ✅ С новой строки

Что запомнить

  • fmt.Scanln(&переменная) — ввод данных
  • Амперсанд (&) обязателен
  • Enter/Return завершает ввод
  • Работает с int, string, float64, bool и др.
  • Всегда показывайте приглашение к вводу
  • Этот метод для идеального пользователя
  • Обработка ошибок — отдельная сложная тема
  • После ввода переменная используется как обычная

Полезные ссылки