【每日一库】Web 表单验证利器:go-playground/validator

polaris · 2020-02-27 16:29:32 · 6022 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-02-27 16:29:32 的主题,其中的信息可能已经有所发展或是发生改变。

这是一个 Go 结构体及字段校验器,包括:跨字段和跨结构体校验,Map,切片和数组,是目前校验器相关库中 Star 数最高的一个,对国际化支持也很好,建议大家使用它。

它具有以下独特功能:

  • 通过使用验证标签(tag)或自定义验证程序进行跨字段和跨结构体验证;
  • 切片,数组和 map,可以验证任何的多维字段或多层级;
  • 能够深入(多维)了解 map 键和值以进行验证;
  • 通过在验证之前确定其基础类型来处理接口类型;
  • 处理自定义字段类型,例如 sql driver Valuer;
  • 别名验证标签,允许将多个验证映射到单个标签,以便更轻松地定义结构上的验证;
  • 提取自定义定义的字段名称,例如可以指定在验证时提取 JSON 名称,并将其用于结果 FieldError 中;
  • 可自定义的 i18n 错误消息;
  • gin Web 框架的默认验证器;

项目地址:https://github.com/go-playground/validator,目前 Star 数 4.8k。

安装

目前最新版本是 v10,建议使用最新版本:

$ go get github.com/go-playground/validator/v10

在你的代码中使用:

import "github.com/go-playground/validator/v10"

一个简单的例子

通过一个简单例子来看看如何使用该库。

package main

import (
    "fmt"
    "flag"

    "github.com/go-playground/validator/v10"
)

type User struct {
    Name  string `validate:"required"`
    Age   uint   `validate:"gte=1,lte=130"`
    Email string `validate:"required,email"`
}

var (
    name  string
    age   uint
    email string
)

func init() {
    flag.StringVar(&name, "name", "", "输入名字")
    flag.UintVar(&age, "age", 0, "输入年龄")
    flag.StringVar(&email, "email", "", "输入邮箱")
}

func main() {
    flag.Parse()

    user := &User{
        Name:  name,
        Age:   age,
        Email: email,
    }

    validate := validator.New()
    err := validate.Struct(user)
    if err != nil {
        fmt.Println(err)
    }
}

执行如下命令,运行代码:

go run main.go -name studygolang -age 7 -email polaris@studygolang.com

什么都没有输出,表示一切正常。如果我们提供一个非法的邮箱地址:

go run main.go -name studygolang -age 7 -email polaris<a href="/user/studygolang" title="@studygolang">@studygolang</a>

输出如下错误:

Key: 'User.Email' Error:Field validation for 'Email' failed on the 'email' tag

小结

Gin 框架默认集成了该库;Echo 框架提供了 Validator 接口,可以很容易的继承该库。大家进行 Web 开发推荐使用。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6022 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传