Модульні уроки (2/5)
Множинні повернення та іменовані повернення
У Go функція може повертати кілька значень. Це механізм, який
вмикає шаблон (value, error), який ви вже бачили, і який пронизує
всю стандартну бібліотеку.
Кілька повернень
Типи повернення вказуються в круглих дужках, розділених комами:
func divmod(a, b int) (int, int) {
return a / b, a % b
}
q, r := divmod(17, 5) // q=3, r=2Вони деструктуровані з множинним призначенням. Відкинути один із
значення використовують _:
_, r := divmod(17, 5) // solo il restoКанонічний шаблон (T, error)
Майже весь stdlib слідує за ним. error ЗАВЖДИ останній:
func read(path string) ([]byte, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("read %q: %w", path, err)
}
return data, nil
}Іменовані повернення
Ви можете називати значення, що повертаються: вони стають попередньо оголошеними змінними
ініціалізується нулем, а return без аргументів повертає їх ("голі
повернення"):
func divmod(a, b int) (q, r int) {
q = a / b
r = a % b
return // naked: ritorna q, r
}Іменовані повернення також відображаються в підказках документації, тому вони корисні як форму вбудованої документації для складних функцій — а не просто для голого повернення.
Більше двох повернень?
Ніщо не заважає вам (int, int, int, error), але якщо ви відчуваєте потребу
це майже завжди означає, що ви повинні повернути struct:
type Result struct {
Sum int
Avg float64
Max int
}
func analyze(nums []int) (Result, error) { ... }Спробуйте
Визначте divmod(a, b int) (int, int), який повертає частку та залишок.
Показати підказку
Типи результатів між дужками: `(int, int)`.
Рішення доступне після 3 спроб
Реалізація safeDiv(a, b int) (int, error): if b == 0 повертає (0, errors.New('divisione per zero')), інакше (a/b, nil).
Показати підказку
Помилка ЗАВЖДИ як останнє значення. При помилці: нульове значення + помилка.
Рішення доступне після 3 спроб
Що ця програма друкує, використовуючи іменовані повернення?
func f() (a, b int) {
a = 1
b = 2
return
}
x, y := f()
fmt.Println(x, y)Підведення підсумків
- Кілька значень у круглих дужках:
func f() (T1, T2, error). - Конвенція:
errorЗАВЖДИ як останнє значення; на помилку, нульове значення + помилка. - Іменовані повернення попередньо оголошують змінні та дозволяють оголені повернення.
- Оголені повернення лише в дуже коротких функціях; крім того, страждає читабельність.
- Більше 2-3 повернень? Можливо, вам потрібна структура.