# 6.4. validator 请求校验 社区里曾经有人用这张图来嘲笑 PHP: ![validate 流程](../images/ch6-04-validate.jpg) 实际上这是一个语言无关的场景,需要进行字段校验的情况有很多,web 系统的 Form/json 提交只是一个典型的例子。我们用 go 来写一个类似上图的校验 demo。然后研究怎么一步步对其进行改进。假设我们的数据已经通过某个 binding 库绑定到了具体的 struct 上。 ```go type RegisterReq struct { Username string PasswordNew string PasswordRepeat string Email string } func register(req RegisterReq) error{ if len(req.Username) > 0 { if len(req.PasswordNew) > 0 && len(req.PasswordRepeat) > 0 { if req.PasswordNew == req.PasswordRepeat { if emailFormatValid(req.Email) { createUser() return nil } else { return errors.New("invalid email") } } else { return errors.New("password and reinput must be the same") } } else { return errors.New("password and password reinput must be longer than 0") } } else { return errors.New("length of username cannot be 0") } } ``` 我们在 golang 里成功写出了 hadoken 开路的箭头型代码。。这种代码一般怎么进行优化呢?