0Pricing
Go Academy · Урок

Несколько возвращаемых значений

Возврат кортежей и шаблон обработки ошибок

«Несколько возвращаемых значений» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Зачем нужны несколько возвращаемых значений?

Функции Go могут возвращать несколько значений, устраняя необходимость в выходных параметрах и исключениях. Наиболее распространённый шаблон — возврат результата и ошибки:

func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

Обработка нескольких возвращаемых значений

Вызывающая сторона получает все возвращаемые значения как кортеж. Используйте _, чтобы отбросить ненужные значения:

result, err := divide(10, 3)
if err != nil {
    log.Fatal(err)
}
fmt.Println(result)

value, _ := divide(8, 2) // discard error

Именованные возвращаемые значения

Возвращаемым значениям можно присвоить имена, превратив их в переменные внутри функции:

func minMax(nums []int) (min, max int) {
    min, max = nums[0], nums[0]
    for _, n := range nums[1:] {
        if n < min { min = n }
        if n > max { max = n }
    }
    return // naked return
}

Неявные возвраты

return без аргументов возвращает именованные переменные возврата. Используйте этот приём умеренно — только в коротких функциях, где имена говорят сами за себя:

  • Короткие функции: допустимо
  • Длинные функции: ухудшает читаемость — предпочитайте явные возвраты

Шаблон «значение, ошибка»

Канонический шаблон обработки ошибок в Go:

func readConfig(path string) (Config, error) {
    data, err := os.ReadFile(path)
    if err != nil {
        return Config{}, fmt.Errorf("read config: %w", err)
    }
    var cfg Config
    return cfg, json.Unmarshal(data, &cfg)
}

Никогда не игнорируйте ошибки

Игнорировать ошибки с помощью _ опасно. Рекомендуется следующее:

  • Проверяйте каждую ошибку, если только у Вас нет особой причины этого не делать
  • Добавляйте к ошибкам контекст с помощью fmt.Errorf("op: %w", err)
  • Используйте log.Fatal или панику только на границах программы, но не глубоко внутри библиотек

Возврат трёх значений

Некоторые функции возвращают три значения, хотя это встречается реже:

func parseIPPort(s string) (ip string, port int, err error) {
    // ... parsing logic
    return
}

Возврат структур или нескольких значений

Когда возвращать структуру, а когда — несколько значений:

  • 2–3 тесно связанных значения: несколько возвратов вполне подходят
  • 4 и более значений или необязательные поля: используйте структуру
  • Шаблон «значение, ошибка»: всегда используйте несколько возвращаемых значений

Присваивание уже существующим переменным

Используйте =, а не :=, когда присваиваете значения переменным, объявленным до вызова:

var cfg Config
var err error
cfg, err = loadConfig()
if err != nil { ... }

Несколько возвращаемых значений в цепочке вызовов методов

Go напрямую не поддерживает цепочку вызовов методов для нескольких возвращаемых значений (в отличие от Result.map в Rust). Используйте промежуточные переменные, чтобы обрабатывать ошибки на каждом шаге:

data, err := fetchData(url)
if err != nil { return err }
parsed, err := parseData(data)
if err != nil { return err }
return save(parsed)

Быстрая проверка

Что делает неявный возврат в Go?

Итоги: несколько возвращаемых значений

Несколько возвращаемых значений — один из основных идиоматичных приёмов Go:

  • Функции могут возвращать несколько значений в списке, заключённом в скобки
  • Шаблон «значение, ошибка» встречается повсюду — всегда проверяйте ошибку
  • Именованные переменные возврата позволяют использовать неявные возвраты (применяйте их умеренно)
  • Используйте _, чтобы отбросить ненужные значения
  • Предпочитайте несколько возвращаемых значений выходным параметрам — так интерфейсы получаются чище

Далее: вариативные функции.

Часто задаваемые вопросы

Урок «Несколько возвращаемых значений» бесплатный?

Да — полный текст урока «Несколько возвращаемых значений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Несколько возвращаемых значений»?

Возврат кортежей и шаблон обработки ошибок Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Несколько возвращаемых значений»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы функций и сигнатуры
  2. Несколько возвращаемых значений
  3. Функции с переменным числом аргументов
  4. defer, анонимные функции и замыкания
← Назад к Go Academy