首页 > 解决方案 > 如何使用 go-playground 验证器在嵌入式结构上运行自定义验证函数

问题描述

我正在尝试使用 go-playgrounds 验证器包为结构注册自定义验证。

我遇到的问题是我注册的自定义验证器函数没有被嵌入式结构调用。

这是一个完整的工作示例: https: //play.golang.org/p/r7oaSo890q_L

那么,如何在嵌入式结构上运行结构级别验证?

编辑*

只是具体一点-我不想使用一般的结构验证,因为我希望有多个相同类型的标签。

我的意思是使用:

validator.RegisterStructValidation(SomeFunc, decimal.Decimal)

对我不起作用,因为我希望具有相同类型的多个标签的灵活性。有时我希望小数为 pos,有时为 neg 等

EDIT2* 这是链接中的代码:

package main

import (
    "fmt"
    "github.com/shopspring/decimal"
    "gopkg.in/go-playground/validator.v9"
)


type decimalPosRequest struct {
    MoneyAmount decimal.Decimal `validate:"decimalpos"` // trying to validate this
}

func main() {
    val := validator.New()
    val.RegisterValidation(`decimalpos`,ValidateDecimalPositive)

    request := decimalPosRequest{MoneyAmount: decimal.NewFromFloat(-1.0)}
    err := val.Struct(&request)
    if err == nil {
        fmt.Println("Error! Should have failed but didn't")
    }
}

func ValidateDecimalPositive(fl validator.FieldLevel) bool { // this function is never called for some reason
    // get decimal
    value := fl.Field().Interface().(decimal.Decimal)
    // check is positive
    return value.IsPositive()
}

标签: validationgo

解决方案


推荐阅读