Golangの検証ライブラリの探検
Min-jun Kim
Dev Intern · Leapcell

Key Takeaways
validatorライブラリは、簡潔で効率的な検証のために構造体タグを使用します。ozzo-validationライブラリは、柔軟なコードベースの検証アプローチを提供します。- どちらを選択するかは、プロジェクトの複雑さと検証のニーズによって異なります。
データ検証はソフトウェア開発の重要な側面であり、入力データが処理前に必要な基準を満たしていることを保証します。Goプログラミング言語では、いくつかのライブラリがこのプロセスを容易にし、validatorとozzo-validationが最も著名です。この記事では、これらのライブラリを詳しく調べ、その機能、使用法、および違いを強調します。
validatorライブラリ
Go Playgroundコミュニティによって開発されたvalidatorライブラリは、Goでの構造体フィールド検証のための広く採用されているソリューションです。構造体タグを使用して検証ルールを定義し、コードを簡潔で読みやすくします。
インストール
validatorをプロジェクトに組み込むには、次のコマンドを使用します。
go get github.com/go-playground/validator/v10
基本的な使用法
適切な検証タグを使用して構造体を定義します。
package main import ( "fmt" "github.com/go-playground/validator/v10" ) type User struct { Name string `validate:"required,min=3,max=32"` Email string `validate:"required,email"` Age int `validate:"gte=18,lte=100"` } func main() { validate := validator.New() user := &User{ Name: "Alice", Email: "alice@example.com", Age: 30, } err := validate.Struct(user) if err != nil { fmt.Println("Validation errors:", err) } else { fmt.Println("Validation passed!") } }
この例では、User構造体には、構造体タグを使用して指定された検証ルールを持つ3つのフィールドがあります。
Name: 存在する必要があり(required)、長さは3〜32文字である必要があります。Email: 存在し、有効なメール形式に従う必要があります。Age: 18〜100の間である必要があります(両端を含む)。
一般的な検証タグ
validatorライブラリは、包括的な検証タグのセットを提供します。
required: フィールドが空でないことを保証します。len: 文字列、スライス、配列、またはマップの正確な長さを指定します。minおよびmax: 数字の最小値と最大値、または文字列、スライス、配列、またはマップの長さを定義します。eqおよびne: フィールドが指定された値と等しいか等しくないことをアサートします。lt、lte、gt、gte: それぞれ、より小さい、より小さいか等しい、より大きい、およびより大きいか等しい比較を表します。oneof: フィールドが指定された値のいずれかに一致することを保証します。
検証タグとその使用法の包括的なリストについては、公式ドキュメントを参照してください。
カスタム検証関数
組み込みタグを超えて、validatorはカスタム検証関数の作成を許可します。たとえば、文字列が「Go」で始まることを検証するには:
func startsWithGo(fl validator.FieldLevel) bool { return strings.HasPrefix(fl.Field().String(), "Go") } func main() { validate := validator.New() validate.RegisterValidation("startsWithGo", startsWithGo) type Language struct { Name string `validate:"startsWithGo"` } lang := &Language{Name: "Golang"} err := validate.Struct(lang) if err != nil { fmt.Println("Validation errors:", err) } else { fmt.Println("Validation passed!") } }
このスニペットでは、カスタム検証関数startsWithGoは、Nameフィールドが「Go」で始まるかどうかを確認します。
ozzo-validationライブラリ
Goエコシステムにおけるもう1つの堅牢な検証ライブラリは、ozzo-validationです。構造体タグに依存するvalidatorとは異なり、ozzo-validationはコードを使用して検証ルールを定義し、より大きな柔軟性と制御を提供します。
インストール
ozzo-validationをプロジェクトに追加するには、次を実行します。
go get github.com/go-ozzo/ozzo-validation/v4
基本的な使用法
ozzo-validationを使用して構造体を定義および検証する方法を次に示します。
package main import ( "fmt" "github.com/go-ozzo/ozzo-validation/v4" "github.com/go-ozzo/ozzo-validation/v4/is" ) type User struct { Name string Email string Age int } func (u User) Validate() error { return validation.ValidateStruct(&u, validation.Field(&u.Name, validation.Required, validation.Length(3, 32)), validation.Field(&u.Email, validation.Required, is.Email), validation.Field(&u.Age, validation.Min(18), validation.Max(100)), ) } func main() { user := User{ Name: "Alice", Email: "alice@example.com", Age: 30, } err := user.Validate() if err != nil { fmt.Println("Validation errors:", err) } else { fmt.Println("Validation passed!") } }
このアプローチでは、User構造体には、validationパッケージの関数を使用して検証ルールを指定するValidateメソッドがあります。
主な機能
- Fluent API: 検証ルールは、読みやすさを向上させるFluentインターフェイスを使用して定義されます。
- 条件付き検証: 他のフィールド値に基づいて条件付き検証ルールをサポートします。
- カスタムバリデーター: 特定の要件に合わせて調整されたカスタム検証ルールの作成を許可します。
validatorとozzo-validationの選択
どちらのライブラリも、Goでのデータ検証のための強力なツールですが、異なるアプローチがあります。
validator: 検証ルールに構造体タグを利用し、簡潔なコードにつながります。広く使用されており、Ginのようなフレームワークとシームレスに統合されています。ただし、複雑な検証ロジックは、構造体タグだけでは扱いにくくなる可能性があります。ozzo-validation: コードを使用して検証ルールを定義し、特に複雑な検証シナリオに対して、より大きな柔軟性と明確さを提供します。このアプローチは、コンパイル時のチェックの恩恵を受け、誤って構成されたタグによるサイレントエラーの可能性を減らします。
2つの選択は、プロジェクトのニーズによって異なります。
- 最小限のロジックで簡単な検証を行う場合、
validatorはクリーンで効率的なソリューションを提供します。 - 条件付きロジックまたはカスタムルールを必要とする複雑な検証の場合、
ozzo-validationの方が適切かもしれません。
結論
データ検証は、ソフトウェアアプリケーションの整合性と信頼性を確保するために不可欠です。Goのエコシステムは、このプロセスを容易にするために、validatorやozzo-validationのような堅牢なライブラリを提供します。それらの機能と違いを理解することで、開発者は特定のユースケースに最適なツールを選択でき、より保守しやすく、エラーのないコードベースにつながります。
FAQs
validatorは構造体タグを使用し、ozzo-validationはコードでルールを定義します。
はい、その機能を拡張するためにカスタム検証関数を許可します。
ozzo-validationは、複雑で条件付きの検証ルールに適しています。
Leapcellは、Goプロジェクトをホストするためのあなたのトップチョイスです。
Leapcellは、Webホスティング、非同期タスク、およびRedisのための次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発します。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ支払い—リクエストも料金もかかりません。
比類のないコスト効率
- アイドル料金なしの従量課金制。
- 例:25ドルで平均応答時間60msで694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムメトリックとロギング。
簡単なスケーラビリティと高性能
- 高い同時実行性を簡単に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ—構築に集中するだけです。
ドキュメントで詳細をご覧ください!
Xでフォローしてください:@LeapcellHQ



