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

В Go функция может возвращать несколько значений. Чаще всего вторым или последним значением возвращается ошибка типа error. Если ошибки нет, возвращается nil, а если произошла ошибка — возвращается конкретная ошибка, а полезное значение обычно игнорируется или равно нулевому значению для своего типа.

Синтаксис

gofunc functionName(params) (returnType, error) {
  // code
}

Пример

Давайте напишем функцию, которая делит два числа и возвращает результат вместе с ошибкой, если делитель равен нулю:

gopackage 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)
}

Результат выполнения кода:

go"Результат: 5"

Пример

Теперь попробуем разделить на ноль и посмотрим, как обрабатывается ошибка:

gopackage 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)
}

Результат выполнения кода:

go"Ошибка: деление на ноль"

Пример

Часто результатом работы функции бывает строка. Давайте напишем функцию, которая возвращает приветствие для пользователя, а если имя пустое — возвращает ошибку:

gopackage 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)
}

Результат выполнения кода:

go"Привет, Alice!"

Пример

А теперь передадим пустую строку и посмотрим на обработку ошибки:

gopackage 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"Ошибка: имя не может быть пустым"

Пример

В Go часто возвращают несколько значений вместе с ошибкой. Например, функция может вернуть результат и флаг успешности, а также ошибку:

gopackage 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)
}

Результат выполнения кода:

go"Результат: обработано: test, Успех: true"

Смотрите также

  • функцию error —
    встроенный интерфейс для работы с ошибками
  • функцию errors.New —
    создание новой ошибки
  • функцию custom error —
    создание пользовательских типов ошибок
  • функцию checking —
    способы проверки ошибок в Go