golang,go,博客,开源,编程

golang每日一库之govalidator

Published on with 0 views and 0 comments

govalidator 是一个用 Go 语言编写的轻量级的验证库,提供了丰富的验证和清理功能,主要用于验证和清理用户输入的数据(如表单数据、API 请求的 JSON 数据等)。它支持常见的数据验证功能,如电子邮件、URL、IP 地址、信用卡号等的验证,同时也支持自定义验证规则。

1. 安装

你可以通过 go get 来安装 govalidator

go get github.com/asaskevich/govalidator

安装完成后,你就可以在 Go 项目中使用它进行输入验证和数据清理了。

2. 基本用法

govalidator 提供了两种常见的验证方式:

  • 函数式验证:通过函数调用来进行验证。
  • 结构体标签:通过结构体标签和 govalidator 提供的标签来对结构体字段进行验证。

2.1 函数式验证

常见的验证方法如:govalidator.IsEmail()govalidator.IsURL() 等,用于验证字符串是否符合特定规则。

package main

import (
	"fmt"
	"github.com/asaskevich/govalidator"
)

func main() {
	// 验证邮箱
	email := "test@example.com"
	if govalidator.IsEmail(email) {
		fmt.Println(email, "is a valid email address")
	} else {
		fmt.Println(email, "is NOT a valid email address")
	}

	// 验证 URL
	url := "https://www.example.com"
	if govalidator.IsURL(url) {
		fmt.Println(url, "is a valid URL")
	} else {
		fmt.Println(url, "is NOT a valid URL")
	}

	// 验证 IP 地址
	ip := "192.168.0.1"
	if govalidator.IsIP(ip) {
		fmt.Println(ip, "is a valid IP address")
	} else {
		fmt.Println(ip, "is NOT a valid IP address")
	}
}
  • govalidator.IsEmail(email):检查字符串是否为有效的电子邮件地址。
  • govalidator.IsURL(url):检查字符串是否为有效的 URL。
  • govalidator.IsIP(ip):检查字符串是否为有效的 IP 地址。

2.2 结构体验证

govalidator 支持通过结构体标签来进行验证,类似于 json 标签的方式。

package main

import (
	"fmt"
	"github.com/asaskevich/govalidator"
)

type User struct {
	Email string `valid:"email"`
	Age   int    `valid:"range(18|60)"`
}

func main() {
	// 创建一个 User 对象
	user := User{
		Email: "test@example.com",
		Age:   25,
	}

	// 验证结构体
	valid, err := govalidator.ValidateStruct(user)
	if err != nil {
		fmt.Println("Error:", err)
	} else if valid {
		fmt.Println("User is valid")
	} else {
		fmt.Println("User is not valid")
	}
}
  • valid:"email":验证 Email 字段是否是有效的电子邮件地址。
  • valid:"range(18|60)":验证 Age 字段是否在 18 到 60 的范围内。

3. 常见的验证方法

govalidator 提供了大量的内建验证函数,以下是一些常见的验证方法:

3.1 验证常见数据类型

  • 邮箱govalidator.IsEmail(string) 用来验证是否为有效的电子邮件。
  • URLgovalidator.IsURL(string) 用来验证是否为有效的 URL。
  • IP 地址govalidator.IsIP(string) 用来验证是否为有效的 IP 地址。
  • 信用卡号govalidator.IsCreditCard(string) 用来验证是否为有效的信用卡号。
  • 日期govalidator.IsDate(string) 用来验证是否为有效的日期。
  • 手机号govalidator.IsMobile(string) 用来验证是否为有效的手机号。
email := "test@example.com"
if govalidator.IsEmail(email) {
	fmt.Println("Valid email")
} else {
	fmt.Println("Invalid email")
}

url := "https://example.com"
if govalidator.IsURL(url) {
	fmt.Println("Valid URL")
} else {
	fmt.Println("Invalid URL")
}

ip := "192.168.1.1"
if govalidator.IsIP(ip) {
	fmt.Println("Valid IP")
} else {
	fmt.Println("Invalid IP")
}

3.2 自定义验证

你可以自定义验证规则,在某些特殊的情况下,govalidator 允许你提供自定义验证器。

// 自定义验证规则
govalidator.CustomTypeTagMap.Set("valid_password", govalidator.CustomValidator(func(str string) bool {
	// 密码验证规则:至少6个字符,包含一个数字和一个字母
	return len(str) >= 6 && containsDigit(str) && containsLetter(str)
}))

// 用自定义规则验证字段
type User struct {
	Password string `valid:"valid_password"`
}

func containsDigit(str string) bool {
	for _, c := range str {
		if c >= '0' && c <= '9' {
			return true
		}
	}
	return false
}

func containsLetter(str string) bool {
	for _, c := range str {
		if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') {
			return true
		}
	}
	return false
}

func main() {
	user := User{Password: "abc123"}
	valid, err := govalidator.ValidateStruct(user)
	if err != nil {
		fmt.Println("Invalid:", err)
	} else if valid {
		fmt.Println("Valid user")
	}
}
  • govalidator.CustomTypeTagMap.Set("valid_password", ...):定义了一个新的验证规则 valid_password,并且通过一个自定义函数来判断密码是否符合规则。

3.3 清理数据

govalidator 还提供了数据清理的功能,比如去除空格、转换大小写等。

str := "   hello world   "
cleanStr := govalidator.Trim(str) // 去除前后的空格
fmt.Println("Cleaned String:", cleanStr)

str = "hElLo WoRlD"
cleanStr = govalidator.ToLower(str) // 转换为小写
fmt.Println("Lowercase String:", cleanStr)
  • govalidator.Trim(str):去除字符串两端的空格。
  • govalidator.ToLower(str):将字符串转换为小写。

4. 结构体验证

结构体验证是 govalidator 中非常强大的功能。你可以通过结构体标签指定验证规则,来方便地对结构体的字段进行验证。

4.1 结构体字段验证

type User struct {
	Email   string `valid:"email"`
	Age     int    `valid:"range(18|100)"`
	Website string `valid:"url"`
}

func main() {
	user := User{
		Email:   "test@example.com",
		Age:     25,
		Website: "https://example.com",
	}

	// 验证结构体
	valid, err := govalidator.ValidateStruct(user)
	if err != nil {
		fmt.Println("Validation Error:", err)
	} else if valid {
		fmt.Println("User is valid")
	} else {
		fmt.Println("User is not valid")
	}
}
  • valid:"email":验证邮箱字段是否符合电子邮件格式。
  • valid:"range(18|100)":验证年龄是否在 18 到 100 的范围内。
  • valid:"url":验证网址是否符合 URL 格式。

5. 总结

govalidator 是一个非常强大的库,提供了丰富的功能来验证和清理数据。它支持多种常见的验证功能,如邮箱、URL、IP 地址、信用卡号等,同时也支持自定义验证和数据清理。通过结构体标签,你可以轻松地对输入进行验证,确保数据的正确性。

主要特点:

  • 简单易用,函数式和结构体标签式的验证方式。
  • 支持常见的验证功能,如电子邮件、URL、手机号、IP 等。
  • 支持自定义验证规则。
  • 支持数据清理操作,如去除空格、转换大小写等。

标题:golang每日一库之govalidator
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/02/10/1739164536237.html
联系:scotttu@163.com