Home >Backend Development >Golang >Go Gin: Create a generic custom validator

Go Gin: Create a generic custom validator

WBOY
WBOYforward
2024-02-10 12:51:09439browse

Go Gin:创建通用自定义验证器

php Xiaobian Yuzai brings you a practical development tool - a universal custom validator in the Go Gin framework. As a high-performance web framework, Go Gin provides a powerful validator function to help developers ensure the legality and integrity of data when processing user input. Universal custom validators can customize various validation rules according to development needs, simplify the code writing process, and improve development efficiency. This article will introduce in detail how to create a universal custom validator, and explain its usage and precautions. Whether you are a beginner or an experienced developer, you will benefit greatly from it. Let’s explore the universal custom validators in the Go Gin framework!

Question content

I am using go gin to create api in my project. I needed to create a custom validator, so I created something like this:

var valueone validator.func = func(fl validator.fieldlevel) bool {
    value, ok := fl.field()
    if ok {
        if value != "one" {
                  return true
                }
    }
    return true
}

var valuetwo validator.func = func(fl validator.fieldlevel) bool {
    value, ok := fl.field()
    if ok {
        if value != "two" {
                  return true
                }
    }
    return true
}
....

Is there a way to create a single validator that is more generic and can be used in both cases, instead of creating almost the same custom validator multiple times, like:

var value validator.Func = func(fl validator.FieldLevel, param) bool {
    value, ok := fl.Field()
    if ok {
        if value != param {
                  return true
                }
    }
    return true
}

I can't find a way to pass parameters to custom validators in Gin or any other possible way to make these generic validators. I need to create thousands of almost similar validators but I don't want to create custom validators for each validator.

Workaround

You cannot change the function structure because this is the way it is defined in the package.

// func accepts a fieldlevel interface for all validation needs. the return
// value should be true when validation succeeds.

type func func(fl fieldlevel) bool

Instead, we can try to use parameters to customize the validation tag

See examples below

package main

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

type Data struct {
    One string `json:"one" validate:"custom_validation=one"`
    Two string `json:"two" validate:"custom_validation=two"`
}

var validate *validator.Validate

func main() {
    validate = validator.New()

    err := validate.RegisterValidation("custom_validation", func(fl validator.FieldLevel) bool {
        value := fl.Field()
        param := fl.Param()

        return value.String() == param
    })

    if err != nil {
        panic(err)
    }

    // this will succeed
    {
        data := &Data{
            One: "one",
            Two: "two",
        }

        err = validate.Struct(data)
        if err != nil {
            panic(err)
        }
    }

    // it will fail here
    {
        data := &Data{
            Two: "one",
            One: "two",
        }

        err = validate.Struct(data)
        if err != nil {
            panic(err)
        }
    }
}

See more examples here

Note: golang does not support

! ==

The above is the detailed content of Go Gin: Create a generic custom validator. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete