Go Gin: Create a generic custom validator

WBOY
Release: 2024-02-10 12:51:09
forward
426 people have browsed it

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
}
....
Copy after login

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
}
Copy after login

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
Copy after login

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)
        }
    }
}
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template