Golang中Joi类型模式验证的实现与应用

Golang中Joi类型模式验证的实现与应用 Go语言中是否有提供类似Joi(使用过Node.js的人会知道)模式验证的库?Joi基本上验证输入模式,例如一个字符串是否是电子邮件或IP地址。

2 回复

我从未使用过任何验证包,但快速搜索后发现这个包很受欢迎:

GitHub

go-playground/validator

头像

:100: Go 结构体和字段验证,包括跨字段、跨结构体、Map、Slice 和 Array 深度验证 - go-playground/validator

更多关于Golang中Joi类型模式验证的实现与应用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,虽然没有直接等同于Joi的官方库,但有几个功能强大的第三方验证库可以实现类似的模式验证功能。最常用的是go-playground/validator,它通过结构体标签(struct tags)来定义验证规则。

以下是一个使用go-playground/validator进行模式验证的示例:

首先,安装库:

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

然后,示例代码:

package main

import (
	"fmt"
	"github.com/go-playground/validator/v10"
)

type User struct {
	Email string `validate:"required,email"`
	IP    string `validate:"required,ip"`
	Age   int    `validate:"gte=18,lte=60"`
}

func main() {
	validate := validator.New()

	user := User{
		Email: "test@example.com",
		IP:    "192.168.1.1",
		Age:   25,
	}

	err := validate.Struct(user)
	if err != nil {
		fmt.Println("验证失败:", err)
		return
	}
	fmt.Println("验证通过")
}

对于更复杂的自定义验证,可以这样实现:

package main

import (
	"fmt"
	"github.com/go-playground/validator/v10"
)

type Registration struct {
	Username string `validate:"required,alphanum,min=3,max=20"`
	Password string `validate:"required,min=8"`
	Website  string `validate:"omitempty,url"`
}

var validate *validator.Validate

func main() {
	validate = validator.New()

	reg := Registration{
		Username: "john_doe123",
		Password: "securePass123",
		Website:  "https://example.com",
	}

	err := validate.Struct(reg)
	if err != nil {
		for _, err := range err.(validator.ValidationErrors) {
			fmt.Printf("字段 %s 验证失败: %s\n", err.Field(), err.Tag())
		}
		return
	}
	fmt.Println("所有字段验证通过")
}

如果需要类似Joi的链式调用风格,可以考虑asaskevich/govalidator

package main

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

func main() {
	// 直接验证字符串
	email := "test@example.com"
	if govalidator.IsEmail(email) {
		fmt.Println("有效的邮箱地址")
	}

	ip := "192.168.1.256"
	if govalidator.IsIP(ip) {
		fmt.Println("有效的IP地址")
	} else {
		fmt.Println("无效的IP地址")
	}

	// 验证URL
	url := "https://golang.org"
	if govalidator.IsURL(url) {
		fmt.Println("有效的URL")
	}
}

对于需要更接近Joi API风格的场景,可以看看go-ozzo/ozzo-validation

package main

import (
	"fmt"
	"github.com/go-ozzo/ozzo-validation/v4"
	"github.com/go-ozzo/ozzo-validation/v4/is"
)

type ServerConfig struct {
	Host string
	Port int
}

func (c ServerConfig) Validate() error {
	return validation.ValidateStruct(&c,
		validation.Field(&c.Host, validation.Required, is.IP),
		validation.Field(&c.Port, validation.Required, validation.Min(1), validation.Max(65535)),
	)
}

func main() {
	config := ServerConfig{
		Host: "localhost",
		Port: 8080,
	}

	if err := config.Validate(); err != nil {
		fmt.Println("配置验证失败:", err)
		return
	}
	fmt.Println("配置验证通过")
}

这些库都提供了丰富的内置验证规则,包括邮箱、IP地址、URL、数字范围、字符串长度等常见验证需求。go-playground/validator是目前最流行的选择,拥有最活跃的社区支持和最丰富的功能。

回到顶部