シンプルな数値バリデーター
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 67/68。
チャレンジ
簡単インターフェースがどのように動作の契約を定義し、カスタムエラーがバリデーション失敗時にどのように意味のあるフィードバックを提供するかを示す、数値バリデーションシステムを作成してください。このチャレンジでは、インターフェースの作成、カスタム型による実装、およびバリデーションエラーの適切な処理能力が試されます。
2つの入力を受け取ります:
- カンマで区切られたバリデーション対象の数値を含む文字列(例:
"45,150,25,200,75") "min:max"形式のバリデーション範囲を含む文字列(例:"1:100")
あなたのタスクは以下の通りです:
- 単一のメソッド
Validate() errorを持つValidatorインターフェースを定義する Value(int) とMessage(string) の2つのフィールドを持つValidationError構造体というカスタムエラー型を作成するValidationErrorに対してError() stringメソッドを実装し、"Validation failed: [message] (value: [value])"という形式でメッセージを返すようにするNumber(int)、Min(int)、Max(int) の3つのフィールドを持つNumberValidator構造体を作成するNumberValidatorに対してValidate() errorメソッドを実装し、以下の動作をさせる:- 数値が有効な範囲内(境界値を含む)であれば
nilを返す - 数値が最小値より小さい場合は、メッセージ
"number below minimum range"を持つValidationErrorを返す - 数値が最大値より大きい場合は、メッセージ
"number above maximum range"を持つValidationErrorを返す
- 数値が有効な範囲内(境界値を含む)であれば
- 最初の入力をカンマで分割して、個々の数値文字列を取得する
- 2番目の入力をコロンで分割して、最小値と最大値を抽出する
strconvパッケージを使用して、すべての文字列値を整数に変換する- バリデーションヘッダーを表示する:
"=== NUMBER VALIDATION SYSTEM ===" - バリデーションパラメータを表示する:
"Validating numbers in range [min] to [max]" - 各数値について:
- 数値と範囲の値を使用して
NumberValidatorインスタンスを作成する - バリデータに対して
Validate()メソッドを呼び出す - バリデーションに合格した場合(エラーが
nilの場合)、"✓ [number] is valid"と表示する - バリデーションに失敗した場合(エラーが
nilでない場合)、"✗ [error_message]"と表示する
- 数値と範囲の値を使用して
- バリデーションサマリーを表示する:
"=== VALIDATION SUMMARY ===""Total numbers checked: [total_count]""Valid numbers: [valid_count]""Invalid numbers: [invalid_count]"
- 完了メッセージを表示する:
"Number validation completed successfully"
入力文字列の分割には strings パッケージを、文字列から整数への変換には strconv パッケージを、フォーマットされた出力には fmt パッケージを使用してください。このチャレンジは、カスタムエラー型を通じて詳細なエラー情報を提供しながら、インターフェースを使用して柔軟なバリデーションシステムを作成する方法を示しています。
自分で試してみよう
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// 入力を読み込む
var numbersInput string
var rangeInput string
fmt.Scanln(&numbersInput)
fmt.Scanln(&rangeInput)
// 入力を解析する
numberStrings := strings.Split(numbersInput, ",")
rangeParts := strings.Split(rangeInput, ":")
// 範囲の値を整数に変換する
min, _ := strconv.Atoi(rangeParts[0])
max, _ := strconv.Atoi(rangeParts[1])
// TODO: 以下にコードを記述してください
// 1. Validator インターフェースを定義する
// 2. ValidationError 構造体を作成し、Error() メソッドを実装する
// 3. NumberValidator 構造体を作成し、Validate() メソッドを実装する
// 4. 各数値を処理し、バリデーションを行う
// 5. 結果とサマリーを表示する
// バリデーションのヘッダーを表示
fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
fmt.Printf("Validating numbers in range %d to %d\n", min, max)
// ここで各数値を処理する
// バリデーションのサマリーを表示
fmt.Println("=== VALIDATION SUMMARY ===")
// ここにサマリー出力を追加
fmt.Println("Number validation completed successfully")
}