← Все этапы
03 · ПРОЕКТИРОВАНИЕУрок 08 из 1245 мин

Ошибки и проверка входа

Возвращаем ошибки вызывающему коду и тестируем корректные и неверные данные.

Ошибка — часть результата

Функция разбора должна вернуть либо данные, либо объяснимую причину отказа. Проверяйте не только возможность преобразовать число, но и допустимость самого значения.

package main

import (
	"fmt"
	"strconv"
)

func parsePort(text string) (int, error) {
	port, err := strconv.Atoi(text)
	if err != nil {
		return 0, fmt.Errorf("invalid port %q: %w", text, err)
	}
	if port < 1 || port > 65535 {
		return 0, fmt.Errorf("port out of range: %d", port)
	}
	return port, nil
}

func main() {
	port, err := parsePort("8080")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("port:", port)
}

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

Практика

Попробуйте сами

Напишите validateBookingCode, принимающую строку формата AB-1234 и возвращающую ошибку при неверном формате. Добавьте тесты: QZ-4821 принимается; QZ4821, qz-4821, QZ-482 и QZ-4821x отклоняются. Запустите go test ./....

Проверка результата

Как понять, что получилось

go test ./... проходит: единственный корректный пример QZ-4821 возвращает nil, а примеры без дефиса, с нижним регистром, коротким кодом и лишним символом возвращают ошибку.

Ошибки и проверка входа | Go | WebSchool · Go