Возврат и обработка ошибки

Обработка ошибок — это важная особенность надежного кода. В этом разделе вы добавите немного кода, чтобы функция возвращала ошибку из модуля greetings, а затем обработаете её в вызывающем коде.

  1. В файле greetings/greetings.go добавьте выделенный ниже код.

    Нет смысла возвращать приветствие, если вы не знаете, кому его адресовать. Возвращайте ошибку вызывающей стороне, если имя пустое. Скопируйте следующий код в greetings.go и сохраните файл.

    package greetings
    import (
      "errors"
      "fmt"
    )
    // Hello returns a greeting for the named person.
    func Hello(name string) (string, error) {
      // If no name was given, return an error with a message.
      if name == "" {
        return "", errors.New("empty name")
      }
      // If a name was received, return a value that embeds the name
      // in a greeting message.
      message := fmt.Sprintf("Hi, %v. Welcome!", name)
      return message, nil
    }
    

    В этом коде вы:

    • Изменяете функцию так, чтобы она возвращала два значения: string и error. Вызывающая сторона проверит второе значение, чтобы увидеть, произошла ли ошибка. (Любая функция Go может возвращать несколько значений. За дополнительной информацией обращайтесь к Effective Go.)
    • Импортируете стандартный пакет Go errors, чтобы вы могли использовать errors.New функцию.
    • Добавляете инструкцию if для проверки недопустимого запроса (пустая строка, где имя должно быть) и возвращаете ошибку, если запрос недействителен. Функция errors.New возвращает error с вашим сообщением внутри.
    • Добавьте nil (что означает отсутствие ошибки) в качестве второго значения в успешном возврате. Таким образом, вызывающая сторона сможет увидеть, что функция успешно завершилась.
  2. В файле hello/hello.go обработайте ошибку, возвращаемую функцией Hello, а также значение без ошибки.

    Вставьте следующий код в hello.go.

    package main
    import (
      "fmt"
      "log"
      "example.com/greetings"
    )
    func main() {
      // Set properties of the predefined Logger, including
      // the log entry prefix and a flag to disable printing
      // the time, source file, and line number.
      log.SetPrefix("greetings: ")
      log.SetFlags(0)
      // Request a greeting message.
      message, err := greetings.Hello("")
      // If an error was returned, print it to the console and
      // exit the program.
      if err != nil {
        log.Fatal(err)
      }
      // If no error was returned, print the returned message
      // to the console.
      fmt.Println(message)
    }
    

    В этом коде вы:

    • Настраиваете пакет log для вывода имени команды ("greetings: ") в начале сообщений журнала, без отметки времени или информации о файле источника.
    • Присваиваете оба значения, возвращаемых функцией Hello, включая error, переменным.
    • Измените аргумент функции Hello с имени Гладис на пустую строку, чтобы вы могли проверить ваш код обработки ошибок.
    • Проверяете наличие непустого значения error. В этом случае нет смысла продолжать.
    • Используете функции стандартной библиотеки log package для вывода информации об ошибках. Если вы получаете ошибку, вы используете функцию Fatal пакета log для вывода ошибки и завершения программы.
  3. В командной строке в директории hello запустите hello.go, чтобы подтвердить, что код работает.

    Теперь, поскольку вы передаёте пустое имя, вы получите ошибку.

    $ go run .
    greetings: empty name
    exit status 1
    

Это типичная обработка ошибок в Go: возврат ошибки как значения, чтобы вызывающая сторона могла проверить её.

Далее вы будете использовать Go срез для возврата случайно выбранного приветствия.

GoRu.dev Golang на русском

На сайте представлена адаптированная под русский язык документация языка программирования Golang