Перейти к содержимому

Практика 2. Переменные, константы, типы и преобразования

Цель

Научиться объявлять и изменять переменные, использовать константы и zero values, работать с базовыми типами Go, выполнять явные преобразования и создавать именованные типы для предметных значений.

Подготовка

Создайте новый модуль:

Окно терминала
go mod init example.com/practice-02

Каждое задание можно оформить отдельным каталогом внутри модуля:

practice-02/
├── go.mod
├── task01/
│ └── main.go
├── task02/
│ └── main.go
└── project/
└── main.go

Тогда отдельная программа запускается так:

Окно терминала
go run ./task01

A. Разминка

Задание 1. Три способа объявления

Объявите следующие значения:

  • имя студента;
  • возраст;
  • средний балл;
  • признак наличия стипендии.

Используйте:

  1. var с явным типом;
  2. var с выводом типа;
  3. короткое объявление :=.

Для каждого значения выведите тип и значение:

fmt.Printf("studentName: %T = %v\n", studentName, studentName)

Задание 2. Zero values

Объявите без начальных значений переменные типов:

  • int;
  • float64;
  • bool;
  • string.

Выведите их в кавычках или скобках, чтобы пустая строка была заметна:

int: [0]
float64: [0]
bool: [false]
string: []

В комментарии объясните, что такое zero value и почему переменная Go не остаётся «неинициализированной».

Задание 3. Константы

Создайте константы:

const (
TotalCourses = 4
MonthsInYear = 12
ExcellentGPA = 4.5
)

Вычислите:

  • количество месяцев обучения на четырёхлетней программе;
  • является ли средний балл студента отличным;
  • сколько курсов осталось до выпуска.

Попробуйте изменить TotalCourses. Строку с ошибкой закомментируйте и объясните сообщение компилятора.

Задание 4. Целое и вещественное деление

Для значений total = 17 и count = 5 выведите:

  • результат целочисленного деления;
  • остаток;
  • точное среднее значение типа float64.

Ожидаемый результат:

Целая часть: 3
Остаток: 2
Среднее: 3.40

B. Основные задания

Задание 5. Конвертер температуры

Создайте программу, переводящую температуру из градусов Цельсия в Фаренгейты и Кельвины:

F = C × 9 / 5 + 32
K = C + 273.15

Требования:

  • температура хранится как float64;
  • результат выводится с двумя знаками после точки;
  • названия типов и переменных отражают их смысл;
  • добавьте именованный тип type Celsius float64.

Задание 6. Безопасное преобразование строки

Создайте строку:

input := "2026"

Преобразуйте её в int через strconv.Atoi. Если произошла ошибка, выведите её и завершите функцию main через return.

Затем замените значение на "20x6" и убедитесь, что программа корректно сообщает об ошибке, а не продолжает вычисления.

Запрещено игнорировать ошибку через _.

Задание 7. Именованные идентификаторы

Объявите типы:

type StudentID int64
type CourseID int64

Создайте значения обоих типов. Попробуйте присвоить CourseID переменной StudentID. После наблюдения ошибки закомментируйте строку.

Объясните, какую реальную ошибку предотвращают разные именованные типы.

Задание 8. Статусы через iota

Создайте тип TaskStatus и константы:

  • StatusUnknown;
  • StatusNew;
  • StatusInProgress;
  • StatusDone.

Выведите их числовые значения. Zero value должен соответствовать неизвестному статусу.


C. Проект «Профиль студента»

Создайте программу, содержащую:

type StudentID int64
const (
TotalCourses = 4
ExcellentGPA = 4.5
)

Данные студента:

  • идентификатор;
  • имя;
  • год рождения;
  • текущий курс;
  • средний балл;
  • активность обучения;
  • название операционной системы, на которой выполняется работа.

Программа должна вычислить:

  • приблизительный возраст;
  • число завершённых курсов;
  • число оставшихся курсов;
  • предполагаемый год выпуска;
  • является ли студент отличником.

Пример вывода:

================================
ПРОФИЛЬ СТУДЕНТА
================================
ID: 1001
Имя: Анна Петрова
Возраст: 20
Курс: 2 из 4
Завершено курсов: 1
Осталось курсов: 2
Год выпуска: 2028
Средний балл: 4.75
Отличник: true
Активен: true
Платформа: Linux
================================

Требования:

  • используйте const для неизменяемых правил курса;
  • используйте именованный тип для идентификатора;
  • примените явное форматирование fmt.Printf;
  • не используйте ввод пользователя: он появится в следующих работах;
  • код должен проходить go fmt ./..., go test ./... и go vet ./....

Критерии оценивания

КритерийБаллы
Объявления и zero values0–3
Константы и вычисления0–3
Преобразования и обработка ошибки0–3
Именованные типы и iota0–3
Проект и форматирование вывода0–4
Максимум16

Вопросы для защиты

  1. Где можно использовать :=?
  2. Какое zero value имеет каждый базовый тип?
  3. Почему Go требует явных числовых преобразований?
  4. Почему int(4.9) возвращает 4?
  5. Чем именованный тип отличается от псевдонима?
  6. Почему ошибку strconv.Atoi нельзя бездумно отбросить?
  7. Для чего используется iota?