Возврат нескольких значений с error
В Go функция может возвращать несколько значений. Чаще всего вторым или последним значением возвращается ошибка типа error. Если ошибки нет, возвращается nil, а если произошла ошибка — возвращается конкретная ошибка, а полезное значение обычно игнорируется или равно нулевому значению для своего типа.
Синтаксис
func functionName(params) (returnType, error) {
// code
}
Пример
Давайте напишем функцию, которая делит два числа и возвращает результат вместе с ошибкой, если делитель равен нулю:
package main
import (
"errors"
"fmt"
)
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("деление на ноль")
}
return a / b, nil
}
func main() {
res, err := divide(10, 2)
if err != nil {
fmt.Println("Ошибка:", err)
return
}
fmt.Println("Результат:", res)
}
Результат выполнения кода:
"Результат: 5"
Пример
Теперь попробуем разделить на ноль и посмотрим, как обрабатывается ошибка:
package main
import (
"errors"
"fmt"
)
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("деление на ноль")
}
return a / b, nil
}
func main() {
res, err := divide(10, 0)
if err != nil {
fmt.Println("Ошибка:", err)
return
}
fmt.Println("Результат:", res)
}
Результат выполнения кода:
"Ошибка: деление на ноль"
Пример
Часто результатом работы функции бывает строка. Давайте напишем функцию, которая возвращает приветствие для пользователя, а если имя пустое — возвращает ошибку:
package main
import (
"errors"
"fmt"
)
func greet(name string) (string, error) {
if name == "" {
return "", errors.New("имя не может быть пустым")
}
return "Привет, " + name + "!", nil
}
func main() {
msg, err := greet("Alice")
if err != nil {
fmt.Println("Ошибка:", err)
return
}
fmt.Println(msg)
}
Результат выполнения кода:
"Привет, Alice!"
Пример
А теперь передадим пустую строку и посмотрим на обработку ошибки:
package main
import (
"errors"
"fmt"
)
func greet(name string) (string, error) {
if name == "" {
return "", errors.New("имя не может быть пустым")
}
return "Привет, " + name + "!", nil
}
func main() {
msg, err := greet("")
if err != nil {
fmt.Println("Ошибка:", err)
return
}
fmt.Println(msg)
}
Результат выполнения кода:
"Ошибка: имя не может быть пустым"
Пример
В Go часто возвращают несколько значений вместе с ошибкой. Например, функция может вернуть результат и флаг успешности, а также ошибку:
package main
import (
"errors"
"fmt"
)
func processData(data string) (string, bool, error) {
if data == "" {
return "", false, errors.New("данные пустые")
}
return "обработано: " + data, true, nil
}
func main() {
result, ok, err := processData("test")
if err != nil {
fmt.Println("Ошибка:", err)
return
}
fmt.Printf("Результат: %s, Успех: %t\n", result, ok)
}
Результат выполнения кода:
"Результат: обработано: test, Успех: true"
Смотрите также
-
функцию
error—
встроенный интерфейс для работы с ошибками -
функцию
errors.New—
создание новой ошибки -
функцию
custom error—
создание пользовательских типов ошибок -
функцию
checking—
способы проверки ошибок в Go