Несколько возвращаемых значений
Возврат кортежей и шаблон обработки ошибок
«Несколько возвращаемых значений» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Основы функций и сигнатуры
- Несколько возвращаемых значений
- Функции с переменным числом аргументов
- defer, анонимные функции и замыкания