エラーを返す関数
CoddyのGOジャーニー「基礎」セクションの一部 — レッスン 104/109。
Goでは、関数は通常、errorを最後の戻り値として返し、何らかの問題が発生したかどうかを示します。
結果とエラーの両方を返す関数を作成します:
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}関数を呼び出し、エラーを処理します:
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
}出力は次のようになります:
Error: cannot divide by zeroチャレンジ
初心者このチャレンジでは、無効な入力が提供されたときにエラーを返す関数の作成を練習します。
ユーザー名が有効かどうかをチェックする validateUsername 関数を完成させる必要があります。ユーザー名は、少なくとも3文字以上であれば有効です。ユーザー名が有効な場合は、エラーとして nil を返します。無効な場合は、適切なメッセージとともにエラーを返します。
関数を呼び出し、エラーを処理するコードはすでに作成されています。
注意: このチャレンジでは、ユーザー入力の代わりに定義済みの変数を使用します。
チートシート
Goの関数は通常、何らかの問題が発生したかどうかを示すために、最後の戻り値としてerrorを返します。
結果とエラーの両方を返す関数を作成します:
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}関数を呼び出す際にエラーを処理します:
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}エラーがない場合はnilを返し、エラーメッセージを作成するにはerrors.New()を使用します。
自分で試してみよう
package main
import (
"errors"
"fmt"
)
func validateUsername(username string) error {
// TODO: ユーザー名の長さが3文字未満かどうかを確認する
// もしそうなら、"username too short" というメッセージとともにエラーを返す
// そうでなければ、nil(エラーなし)を返す
return nil
}
func main() {
// 有効なユーザー名でテスト
validName := "bob123"
err1 := validateUsername(validName)
if err1 != nil {
fmt.Printf("%s is invalid: %v\n", validName, err1)
} else {
fmt.Printf("%s is valid!\n", validName)
}
// 無効なユーザー名でテスト
invalidName := "ab"
err2 := validateUsername(invalidName)
if err2 != nil {
fmt.Printf("%s is invalid: %v\n", invalidName, err2)
} else {
fmt.Printf("%s is valid!\n", invalidName)
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
11複合型:スライス
スライス入門スライスリテラルの宣言`make` によるスライスの作成スライスの長さと容量スライス要素へのアクセス要素の追加既存のスライス/配列のスライススライスの反復処理スライスのコピーまとめ:動的リスト14エラーハンドリングの基本
エラーの概念`error` インターフェースエラーを返す関数エラーのチェックシンプルなエラーの作成フォーマット済みエラーの作成基本的なエラーハンドリングまとめ:問題への対処