Функции, возвращающие ошибки
Часть раздела Основы путешествия по GO на Coddy — урок 104 из 109.
В Go функции обычно возвращают error в качестве последнего возвращаемого значения, чтобы указать, пошло ли что-то не так.
Создайте функцию, которая возвращает и результат, и ошибку:
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}Вызовите функцию и обработайте ошибку:
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
}Вывод будет:
Error: cannot divide by zeroЗадание
НовичокВ этом испытании вы попрактикуетесь в создании функции, которая возвращает ошибку при получении неверных входных данных.
Вам нужно дополнить функцию validateUsername, которая проверяет, является ли имя пользователя допустимым. Имя пользователя считается допустимым, если его длина составляет не менее 3 символов. Если имя пользователя допустимо, верните nil в качестве ошибки. Если оно недопустимо, верните ошибку с соответствующим сообщением.
Код для вызова вашей функции и обработки ошибки уже написан за вас.
Примечание: В этом испытании используются предопределенные переменные вместо пользовательского ввода.
Шпаргалка
Функции в Go обычно возвращают error в качестве последнего возвращаемого значения, чтобы указать, если что-то пошло не так.
Создайте функцию, которая возвращает и результат, и ошибку:
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}Обработайте ошибку при вызове функции:
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}Возвращайте nil, когда ошибки нет, и используйте errors.New() для создания сообщений об ошибках.
Попробуйте сами
package main
import (
"errors"
"fmt"
)
func validateUsername(username string) error {
// TODO: Проверить, если длина имени пользователя меньше 3 символов
// Если это так, вернуть ошибку с сообщением "username too short"
// В противном случае вернуть nil (нет ошибки)
return nil
}
func main() {
// Тест с валидным именем пользователя
validName := "bob123"
err1 := validateUsername(validName)
if err1 != nil {
fmt.Printf("%s is invalid: %v\n", validName, err1)
} else {
fmt.Printf("%s is valid!\n", validName)
}
// Тест с невалидным именем пользователя
invalidName := "ab"
err2 := validateUsername(invalidName)
if err2 != nil {
fmt.Printf("%s is invalid: %v\n", invalidName, err2)
} else {
fmt.Printf("%s is valid!\n", invalidName)
}
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
4Операторы сравнения и логические операторы
Операторы сравнения — Часть 1Операторы сравнения — Часть 2Логический оператор ANDЛогический оператор ORЛогический оператор NOTОсновы приоритета операторовИтоги: выполнение сравнений7Управляющие конструкции: Циклы
Что такое цикл `for`Цикл `for` — основыЦикл `for` — только условиеКлючевое слово `break`Ключевое слово `continue`Вложенные циклыИтоги — повторение действий2Переменные и базовые типы данных
Что такое переменнаяВывод типов с помощью `:=`Целые числа (int)Числа с плавающей точкойЛогический тип (Booleans)СтрокиНулевые значения (Zero Values)КонстантыПравила именованияИтоги: переменные и типы5Основы ввода-вывода
Форматированный выводСпецификаторы форматаВывод типовБазовый ввод данных пользователемИтоги: ввод и вывод8Функции
Понимание функцийОбъявление функцииВызов функцийПараметры функцииВозврат одного значенияВозврат нескольких значенийИменованные возвращаемые значенияОсновы области видимости функцийИтоги — создание переиспользуемого кода11Составные типы: Срезы
Введение в срезыОбъявление литералов срезовСоздание срезов с помощью `make`Длина и емкость срезаДоступ к элементам срезаДобавление элементовПолучение срезов из существующих срезов/массивовИтерация по срезамКопирование срезовИтоги: Динамические списки14Основы обработки ошибок
Концепция ошибокИнтерфейс `error`Функции, возвращающие ошибкиПроверка ошибокСоздание простых ошибокСоздание форматированных ошибокОсновы обработки ошибокИтоги — решение проблем3Базовые операторы
Арифметические операторыОператор деленияОператор остатка от деленияОператор присваиванияКомбинированные операторы присваиванияИнкремент и декрементПовторение — Вычисления6Управление потоком: Условные конструкции
Оператор `if`Ключевое слово `else`Ключевое слово `else if`Затенение переменных в `if`Инициализация переменныхОператор `switch`Switch с выражениямиSwitch без выраженийКлючевое слово `fallthrough`Итоги — Принятие решений