为了避免结构体默认值带来的困惑,从goframe v1.16版本开始,我们增加了一个新的结构体校验方法CheckStructWithData,用于结构体校验时严格按照给定的map参数而不是按照结构体的属性值,而校验规则同样会自动读取结构体中的gvalid tag。我们来看一个示例,我们将之前的示例进行简单的修改:

package main

import (
	"context"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/util/gconv"
	"github.com/gogf/gf/util/gvalid"
)

func main() {
	type User struct {
		Name string `v:"required#请输入用户姓名"`
		Type int    `v:"required#请选择用户类型"`
	}
	data := g.Map{
		"name": "john",
	}
	user := User{}
	if err := gconv.Scan(data, &user); err != nil {
		panic(err)
	}
	err := gvalid.CheckStructWithData(context.TODO(), user, data, nil)
	// 也可以使用链式操作
	// err := g.Validator().Data(data).CheckStruct(user)
	if err != nil {
		g.Dump(err.Items())
	}
}

执行后,终端输出:

[
    {
        "Type": {
            "required": "请选择用户类型"
        }
    }
]

可以看到,结构体中的属性Type校验规则required并没有受到默认值的影响,仍旧被执行了预期的校验检查。














  • No labels