エラーを返す、および処理する

エラー処理は堅牢なコードの不可欠な機能です。このセクションでは、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
    }
    

    このコードでは、以下のことを行います。

    • 関数を、stringerror の2つの値を返すように変更します。呼び出し元は2番目の値をチェックして、エラーが発生したかどうかを確認します。(任意の Go 関数は複数の値を返すことができます。詳細については、Effective Go を参照してください。)
    • Go 標準ライブラリの errors パッケージをインポートして、その errors.New 関数 を使用できるようにします。
    • 無効なリクエスト (名前に空の文字列がある場合) をチェックする if ステートメントを追加し、リクエストが無効な場合はエラーを返します。errors.New 関数は、メッセージを含む error を返します。
    • 成功した戻り値の2番目の値として 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 引数を Gladys の名前から空の文字列に変更します。
    • 非 nil の error 値を探します。この場合、続行する意味はありません。
    • 標準ライブラリの log package の関数を使用してエラー情報を出力します。エラーが発生した場合は、log パッケージの Fatal 関数 を使用してエラーを出力し、プログラムを停止します。
  3. hello ディレクトリのコマンドラインで hello.go を実行して、コードが機能することを確認します。

    空の名前を渡しているため、エラーが発生します。

    $ go run .
    greetings: empty name
    exit status 1
    

これが Go の一般的なエラー処理です。エラーを値として返すことで、呼び出し元がそれをチェックできるようにします。

次に、Go のスライスを使用して、ランダムに選択された挨拶を返します。