为了避免结构体默认值带来的困惑,从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
并没有受到默认值的影响,仍旧被执行了预期的校验检查。