自己动手写一款自动校正错误参数的GO校验器 govalidator

作者: jekkay 分类: golang 发布时间: 2020-07-16 11:02

自己动手写一款自动校正错误参数的GO校验器 govalidator


概述

在开发Go程序时,很多时候我们都需要对参数进行校验,当参数不合法的时候抛出异常,或者记录到错误日志,在一般情况下是没有任何问题。但是,有时候,我们开发了一些要求稳定性极高的程序时,这时候就要求程序在运行的时候,不仅能检测到错误,还能自行矫正错误,避免被动地等待管理员来人为干预调整,就能使得程序能够自动地一直提供稳定的服务。

自恢复能力

关于程序在运行的过程中,能够自动发现错误,并且能够调整错误确保服务正常的能力,我暂且把它定义自恢复能力

影响程序运行的因素很多,而其自恢复能力的好坏,直接关系到程序的稳定性。从宏观层面来说,如果一个程序的外部输入过多,难免会出现一些意料之外的输入,导致程序无法正常工作。基于这个灵感,我觉得有必要在输入层面做一个 "安全输入防火墙",能过自动调整或者过滤掉外部的错误输入,必要时进行调整,这也是我写这个govalidator的初衷。

govalidator

govalidator是我采用go里面的tag功能编写的一款能够自动调整错误的校验库,其地址如下:

目前已经开发了支持常用类型的校验,支持了以下的tag:

Field Type min max default req in regex
(number)
Int8,Uint8,
Int16,Uint16

Int64,Uint64
× × ×
string
ptr -> number × ×
ptr -> string
ptr -> struct × × × × ×

该库中有三个重要的函数,其功能分别如下:

function parameters description
ValidObject obj:ptr, a pointer to struct object
fix: boolean, indicate whether auto adjust value
auto fix error value
Validate obj:ptr, a pointer to struct object validate object error, return the first one
Validates obj:ptr, a pointer to struct object validate object error, return all errors

快速使用

import (
    "github.com/jekkay/govalidator"
    "encoding/json"
    "fmt"
    "testing"
}

type Range struct {
    A int32   `json:"a" min:"10" max:"100" default:"50"`
    B int32   `json:"b" min:"20" max:"90" default:"80"`
    C *uint64 `json:"c" min:"30" max:"90" req:"true" default:"60"`
    D string  `json:"d" min:"1" max:"10" req:"true" in:"hello,world,jekkay" regex:"^[a-d]+$" default:"jekkay"`
}

func TestValidObject2(t *testing.T) {
    r := new(Range)
    r.A = 120
    r.B = 130

    if e := govalidator.ValidObject(r, false); e != nil {
        fmt.Println(e)
    }
    govalidator.ValidObject(r, true)
    bs, _ := json.MarshalIndent(r, "", "  ")
    fmt.Println(string(bs))
}

结果输出如下:

[
`A` at most 100, current is 120
`B` at most 90, current is 130 
`C` is empty
`D` is empty
]
{
  "a": 100,
  "b": 90,
  "c": 60,
  "d": "jekkay"
}

此库会不断地更新,后续有什么需求,可以直接在github上提issue,或直接联系我:

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据