エラーを返し、処理する

エラー処理は、堅牢なコードの不可欠な機能です。このセクションでは、挨拶モジュールからエラーを返すためのコードを追加し、呼び出し側でそれを処理します。

  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
    }
    

    このコードでは、

    • 関数が2つの値(stringerror)を返すように変更します。呼び出し側は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: 」)を出力するように構成します。
    • errorを含む、Helloの2つの戻り値を両方とも変数に割り当てます。
    • Helloの引数をGladysの名前から空の文字列に変更して、エラー処理コードを試すことができるようにします。
    • nilでないerror値を探します。この場合、処理を続行する意味はありません。
    • 標準ライブラリのlogパッケージの関数を使用してエラー情報を出力します。エラーが発生した場合、logパッケージのFatal関数を使用してエラーを出力し、プログラムを停止します。
  3. helloディレクトリのコマンドラインで、hello.goを実行して、コードが動作することを確認します。

    空の名前を渡すようになったため、エラーが発生します。

    $ go run .
    greetings: empty name
    exit status 1
    

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

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