Основы языка и инструменты: пишем первый консольный калькулятор
Основы языка и инструменты: пишем первый консольный калькулятор
Добро пожаловать в курс Go на практике. Мы не будем тратить время на скучную теорию без дела. Философия этого курса проста: мы изучаем концепцию и сразу же применяем её в реальном коде. К концу курса вы пройдете путь от «Hello World» до написания собственных микросервисов.
Сегодня мы начнем с фундамента. Мы настроим окружение, разберем структуру Go-программы и напишем ваш первый полезный инструмент — консольный калькулятор.
Почему Go?
Язык Go (или Golang) был разработан в Google для решения конкретных проблем: долгая сборка проектов, сложная работа с зависимостями и трудности в написании конкурентного кода.
Go — это компилируемый, статически типизированный язык. Это значит, что:
- Компилируемый: код превращается в бинарный файл (машинный код), который можно запустить на сервере даже без установленного Go.
- Статически типизированный: если вы сказали, что переменная — это число, она не может внезапно стать строкой. Это спасает от тысяч глупых ошибок.
Установка инструментов
Прежде чем писать код, нам нужно подготовить рабочее место.
1. Компилятор Go
Зайдите на официальный сайт Go и скачайте установщик для вашей операционной системы (Windows, macOS или Linux). Установка проходит в режиме «Далее — Далее — Готово».
Чтобы проверить, что всё прошло успешно, откройте терминал (или командную строку) и введите:
go version
Вы должны увидеть что-то вроде go version go1.21.0 ....
2. Среда разработки (IDE)
Писать код в блокноте можно, но больно. Я рекомендую два варианта:
- VS Code: Бесплатный, легкий. Обязательно установите расширение Go от команды Go Team.
- GoLand: Платный (есть пробный период), мощный, от JetBrains. Идеален для больших проектов.
Анатомия Go-программы
Любая программа на Go имеет четкую структуру. Давайте создадим файл main.go и напишем классический приветственный код, чтобы разобрать его по косточкам.
package main
import "fmt"
func main() {
fmt.Println("Привет, будущий Gopher!")
}
Разберем каждую строку:
package main: Эта строка говорит компилятору, что этот файл — исполняемая программа, а не библиотека. Точка входа в любую программу на Go всегда находится в пакетеmain.import "fmt": Мы подключаем пакетfmt(format). В Go очень богатая стандартная библиотека. Пакетfmtотвечает за ввод и вывод данных (печать текста на экран).func main() { ... }: Это главная функция. Когда вы запускаете программу, выполнение кода начинается именно отсюда.
Переменные и типы данных
Для нашего калькулятора нам нужно где-то хранить числа и операцию, которую выбрал пользователь. Для этого нужны переменные.
В Go есть два основных способа создать переменную:
1. Полная декларация
Используется ключевое слово var. Мы явно указываем имя и тип.
var age int = 25
var name string = "Alex"
2. Краткая декларация (Магия Go)
Внутри функций можно использовать оператор :=. Go сам догадается, какой тип у переменной, посмотрев на значение справа.
age := 25 // Go понимает, что это int (целое число)
pi := 3.14 // Go понимает, что это float64 (дробное число)
Важно: В Go нельзя создать переменную и не использовать её. Если вы напишете
x := 10и нигде потом не применитеx, компилятор выдаст ошибку. Это заставляет писать чистый код.
Для калькулятора нам понадобятся:
float64— для чисел с плавающей точкой (ведь мы можем захотеть разделить 5 на 2).string— для знака операции (+, -, *, /).
Логика выбора: if и switch
Калькулятор должен уметь принимать решения. «Если пользователь ввел плюс, нужно сложить».
Конструкция if-else
Классическая проверка условия. Обратите внимание: круглые скобки вокруг условия в Go не нужны.
if x > 10 {
fmt.Println("Больше десяти")
} else {
fmt.Println("Меньше или равно десяти")
}
Конструкция switch
Когда вариантов много (как операций в калькуляторе), switch подходит лучше. Он выглядит чище.
switch operator {
case "+":
// код сложения
case "-":
// код вычитания
default:
// если ничего не подошло
}
В отличие от других языков (C++, Java), в Go не нужно писать break после каждого case. Go выполняет только один подходящий блок и выходит из switch.
Практика: Пишем консольный калькулятор
Теперь соберем всё вместе. Наша цель — программа, которая:
- Спрашивает первое число.
- Спрашивает второе число.
- Спрашивает операцию.
- Выводит результат.
Создайте папку для проекта, откройте её в терминале и инициализируйте модуль (это создаст файл go.mod для управления зависимостями, хорошая привычка с самого начала):
go mod init calculator
Теперь создайте файл main.go и начнем писать код.
Шаг 1: Импорты и переменные
package main
import (
"fmt"
"os"
)
func main() {
var a, b float64 // Переменные для чисел
var op string // Переменная для оператора
Мы используем float64, так как это стандартный тип для дробных чисел в Go.
Шаг 2: Чтение данных
Для ввода данных используем fmt.Scan. Эта функция считывает данные из консоли и кладет их в переменную.
fmt.Print("Введите первое число: ")
fmt.Scan(&a) // Обратите внимание на знак &
fmt.Print("Введите второе число: ")
fmt.Scan(&b)
fmt.Print("Введите операцию (+, -, *, /): ")
fmt.Scan(&op)
Почему &a? Символ & означает, что мы передаем не значение переменной (которое пока пустое), а адрес в памяти, где эта переменная лежит. Функция Scan пойдет по этому адресу и запишет туда то, что вы введете с клавиатуры.
Шаг 3: Логика вычислений
Теперь самое интересное. Используем switch для обработки операций.
var res float64
switch op {
case "+":
res = a + b
case "-":
res = a - b
case "*":
res = a * b
case "/":
if b == 0 {
fmt.Println("Ошибка: деление на ноль!")
os.Exit(1) // Завершаем программу с кодом ошибки
}
res = a / b
default:
fmt.Println("Неизвестная операция")
os.Exit(1)
}
fmt.Printf("Результат: %f\n", res)
}
Здесь мы добавили важную проверку. В математике деление на ноль не определено. Если мы попытаемся разделить на ноль, программа должна нас остановить.
Математически мы проверяем условие:
где — это делитель (второе введенное число). Если равно нулю, операция невозможна.
Также мы использовали fmt.Printf. Это «форматированный вывод». Символ %f заменяется на значение переменной res. \n означает перенос строки.
Полный код проекта
Вот что у вас должно получиться в файле main.go:
package main
import (
"fmt"
"os"
)
func main() {
var a, b float64
var op string
fmt.Print("Введите первое число: ")
fmt.Scan(&a)
fmt.Print("Введите второе число: ")
fmt.Scan(&b)
fmt.Print("Введите операцию (+, -, *, /): ")
fmt.Scan(&op)
var res float64
switch op {
case "+":
res = a + b
case "-":
res = a - b
case "*":
res = a * b
case "/":
if b == 0 {
fmt.Println("Ошибка: деление на ноль!")
os.Exit(1)
}
res = a / b
default:
fmt.Println("Неизвестная операция")
os.Exit(1)
}
fmt.Printf("Результат: %.2f\n", res)
}
Небольшое улучшение: я заменил %f на %.2f в последней строке. Это скажет Go выводить только два знака после запятой, чтобы результат выглядел аккуратнее (например, 5.00 вместо 5.000000).
Запуск программы
У нас есть два пути запуска:
-
Быстрый запуск (для разработки): Команда компилирует и сразу запускает программу, не создавая exe-файл.
go run main.go -
Компиляция (для релиза): Команда создает бинарный файл (например,
calculator.exeна Windows).go buildПосле этого вы можете запустить созданный файл как обычную программу.
Попробуйте запустить свой калькулятор и посчитать что-нибудь!
Резюме
Сегодня вы сделали огромный шаг. Вы не просто узнали синтаксис, вы:
- Настроили профессиональное окружение.
- Поняли структуру Go-файлов (
package,import,func). - Научились работать с переменными и вводом/выводом.
- Написали работающую программу с логикой ветвления.
В следующей статье мы углубимся в структуры данных и узнаем, как хранить списки задач, массивы данных и создавать более сложные конструкции. Готовьтесь, будет интересно!