使用 Validator V10 进行 Go 输入验证的指南

2025-06-11

使用 Validator V10 进行 Go 输入验证的指南

验证器 V10

介绍

在任何软件应用程序中,输入验证对于数据完整性和安全性都至关重要。Go 是一种功能强大且广受欢迎的编程语言,以其简洁性和高性能而闻名,它提供了“validator”包 (v10) 来实现高效的验证。在本篇博文中,我们将探讨如何利用 Go Validator V10有效地验证输入参数并增强应用程序的健壮性。

👩‍💻验证输入参数:

现在让我们深入研究使用 Go Validator V10 进行输入参数验证的实际实现。在本例中,我们将验证一个接收 JSON 格式数据的简单 API 端点的输入参数。

步骤 1:导入 Go Validator 包:

首先,我们validator在 Go 代码中导入包:

import (
    "fmt"
    "net/http"

    "github.com/go-playground/validator/v10"
)
Enter fullscreen mode Exit fullscreen mode

第 2 步:定义数据结构:

接下来,我们定义一个 Go 结构体来表示我们期望接收的输入的数据结构:

type User struct {
    Username  string `json:"username" validate:"required,min=5,max=20"`
    Email     string `json:"email" validate:"required,email"`
    Age       int    `json:"age" validate:"gte=18,lte=120"`
}
Enter fullscreen mode Exit fullscreen mode

在此示例中,我们有一个 User 结构体,其中包含三个字段UsernameEmailAge。我们使用 Go Validator V10 语法添加了验证标签,以指定每个字段的验证规则。

要访问受支持的验证标签的完整列表及其用法,您可以参考以下网址的 Go Validator V10 官方文档:https://pkg.go.dev/github.com/go-playground/validator/v10

步骤3:验证输入:

现在,让我们实现 API 端点并验证传入的数据:

func createUserHandler(w http.ResponseWriter, r *http.Request) {
    var user User

    // Parse the JSON request and populate the User struct
    err := json.NewDecoder(r.Body).Decode(&user)
    if err != nil {
        http.Error(w, "Invalid JSON", http.StatusBadRequest)
        return
    }

    // Create a new validator instance
    validate := validator.New()

    // Validate the User struct
    err = validate.Struct(user)
    if err != nil {
        // Validation failed, handle the error
        errors := err.(validator.ValidationErrors)
        http.Error(w, fmt.Sprintf("Validation error: %s", errors), http.StatusBadRequest)
        return
    }

    // Validation passed, proceed to process the user data
    // Your application logic goes here...

    // Send a success response
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "User created successfully!")
}
Enter fullscreen mode Exit fullscreen mode

在此代码片段中,我们首先解析传入的 JSON 数据并填充 User 结构体。然后,我们创建一个新的验证器实例,并使用 验证 User 结构体validate.Struct(user)。如果验证失败,则会返回包含具体验证错误的错误消息。否则,我们的应用逻辑可以继续处理已验证的数据。

🚀 创建自定义验证器 🚀

除了 Go Validator V10 提供的内置验证标签外,您还可以灵活地创建自定义验证器,以满足特定的应用需求。自定义验证器允许您对数据强制执行特定于域的规则,从而确保更精确的输入验证。

以下是创建名为PercentageValidator的自定义验证器的示例

import (
    "github.com/go-playground/validator/v10"
    "github.com/shopspring/decimal"
)

func PercentageValidator(fl validator.FieldLevel) bool {
    maxPercent := decimal.NewFromInt(100)
    minPercent := decimal.NewFromInt(0)

    switch v := fl.Field(); v.Kind() {
    case reflect.String:
        val, err := decimal.NewFromString(v.String())
        if err == nil && val.Abs().GreaterThanOrEqual(minPercent) && val.Abs().LessThanOrEqual(maxPercent) {
            return true
        }
    case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        val := decimal.NewFromInt(v.Int())
        if val.Abs().GreaterThanOrEqual(minPercent) && val.Abs().LessThanOrEqual(maxPercent) {
            return true
        }
    case reflect.Float32, reflect.Float64:
        val := decimal.NewFromFloat(v.Float())
        if val.Abs().GreaterThanOrEqual(minPercent) && val.Abs().LessThanOrEqual(maxPercent) {
            return true
        }
    default:
        return false
    }

    return false
}
Enter fullscreen mode Exit fullscreen mode

在此示例中,该PercentageValidator函数检查输入值是否代表有效的百分比(范围从 0 到 100)。该验证器支持各种数据类型,包括stringsintegersfloats

要使用此自定义验证器,您需要在执行输入验证之前将其注册到 Go Validator V10。您可以通过以下方式注册:

validate := validator.New()

// Registering the custom validator
validate.RegisterValidation("percentage", PercentageValidator)
Enter fullscreen mode Exit fullscreen mode

现在,您可以将percentage验证标签应用于用户结构或任何其他数据结构中需要百分比验证的任何字段:

type User struct {
    Username  string `json:"username" validate:"required,min=5,max=20"`
    Email     string `json:"email" validate:"required,email"`
    Age       int    `json:"age" validate:"gte=18,lte=120"`
    Discount  float64 `json:"discount" validate:"percentage"`
}
Enter fullscreen mode Exit fullscreen mode

通过创建自定义验证器,您可以根据特定应用程序的需求定制输入验证,确保数据处理的准确性和安全性。

👩‍💻 增强您的验证go-common

在 Go 中使用输入验证时,validator/v10这是一个广泛使用且功能强大的库。随着时间的推移,我发现自己经常添加自定义验证器、管理错误消息以及组织验证逻辑以适应特定的用例。为了简化这些任务,我在go-common库中添加了一个验证器包。

Validator软件包基于此构建validator/v10,并提供了一些工具,使输入验证更加灵活、可自定义且更易于管理。如果您经常创建自定义验证规则,或者需要更好地控制错误消息和字段命名,那么它尤其有用。

验证器的主要特点go-common

  • 轻松集成:简化工作validator/v10并扩展其功能。
  • 自定义验证器:使用自定义错误消息轻松注册您自己的验证规则。
  • 简化验证:用于结构验证的用户友好型 API。
  • 可扩展性:使用简单的界面添加特定于域的验证逻辑。

基本用法:

package main

import (
    "fmt"
    "github.com/kittipat1413/go-common/framework/validator"
)

type Data struct {
    Field1 string `validate:"mytag"`
    Field2 string `validate:"required"`
    Field3 int    `validate:"gte=0,lte=130"`
}

func main() {
    v, err := validator.NewValidator(
        validator.WithCustomValidator(new(MyValidator)),
        // Add more custom validators here
    )
    if err != nil {
        fmt.Println("Error initializing validator:", err)
        return
    }

    data := Data{
        Field1: "test",
        Field3: 200,
    }

    err = v.ValidateStruct(data)
    if err != nil {
        fmt.Println("Validation failed:", err)
    } else {
        fmt.Println("Validation passed")
    }
}
Enter fullscreen mode Exit fullscreen mode

输出:

Validation failed: Field1 failed custom validation, Field2 is a required field, Field3 must be 130 or less
Enter fullscreen mode Exit fullscreen mode

有关更多详细信息、示例和高级用法(如自定义验证器和 JSON 标签支持),请访问GitHub 上的go-common存储库。

如果您觉得go-common有帮助,请在 GitHub 上点个⭐。您的支持有助于项目发展,并鼓励我们进一步改进和完善功能。让我们携手构建更健壮、更安全的 Go 应用程序!

📝结论:

通过使用 Go Validator V10,我们可以轻松地在 Go 应用程序中实现输入参数验证。验证输入参数有助于防止潜在的安全漏洞,并确保应用程序处理的数据准确一致。该库拥有丰富的验证规则,使其成为 Go 开发者的强大工具。

请记住始终验证应用程序中的输入数据,以确保其可靠性和安全性。祝您编码愉快!🥂

☕ 支持我的工作 ☕

如果你喜欢我的作品,不妨请我喝杯咖啡!你的支持能让我继续创作有价值的内容,分享知识。☕

给我买杯咖啡

鏂囩珷鏉ユ簮锛�https://dev.to/kittipat1413/a-guide-to-input-validation-in-go-with-validator-v10-56bp
PREV
⭐️ 实用的 Golang 工具,让你的代码再次变得出色
NEXT
关于 JavaScript 中的日期对象你需要知道的一切