Треки
/
Go
Go
/
Салабус
/
Кілька повернених значень
Кі

Кілька повернених значень у Go

{one: "1 вправа", few: "%{count} вправи", many: "%{count} вправ", other: "%{count} вправи"}

Про концепцію Кілька повернених значень

Функції та методи в Go можуть повертати кілька значень:

func GetCard() (Card, error) { ... }

Кожне повернене значення потрібно присвоїти по порядку, розділяючи їх комами:

card, err := GetCard()

Порожній ідентифікатор

Кожна позиція в присвоєнні оголошує змінну. У Go не можна оголосити змінну й не використати її. Щоб пропустити це повернене значення, використаймо порожній ідентифікатор _ замість назви змінної.

card, _ := GetCard() // error intentionally ignored
_, err := GetCard()  // card ignored, only checking for error

Обробка помилок

error - це вбудований інтерфейс. Помилка зі значенням nil означає, що помилки не сталося; будь-яке значення, відмінне від nil, означає, що щось пішло не так. За домовленістю функції, які можуть зазнати невдачі, повинні повертати error як останнє значення. Той, хто викликає функцію, має перевірити його, перш ніж використовувати інші повернені значення:

card, err := GetCard()
if err != nil {
    // unsafe to use card here
    return err
}
// safe to use card here

Ідіома «кома-ok»

Шаблон присвоєння двох значень трапляється й поза обробкою error. Пошук у мапі, перевірка типу та отримання з каналу також використовують друге булеве значення (англ. Boolean), яке за домовленістю позначають ok, щоб указати на успіх або наявність даних:

m := map[string]int{"a": 1}
v, ok := m["a"] // ok is true
v, ok = m["z"]  // ok is false
var i interface{} = "hello"
v, ok := i.(string) // ok is true
v, ok = i.(int)     // ok is false
v, ok := <-ch // ok is false if ch is closed and empty

Іменовані повернені значення

Поверненим значенням можна також дати імена в сигнатурі функції. Тоді ці змінні доступні всередині тіла функції.

func divide(a, b int) (quotient, remainder int) {
    quotient = a / b
    remainder = a % b
    return quotient, remainder
}

Іменовані повернені значення документують зміст кожної позиції повернення. Їх також можна використовувати з голим return, тобто записаним без значень. Голі return неявно повертають поточні значення іменованих змінних:

func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

У довших функціях голі return часто шкодять читабельності, бо незрозуміло, що саме повертається. Надаваймо перевагу явним поверненим значенням, якщо тільки функція не настільки коротка, що сигнатура завжди перед очима.

Щоб дізнатися більше, зазирнімо до Go by Example: Multiple Return Values, Effective Go: Multiple Returns або Tour of Go.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці