1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 04:22:22 +00:00
This commit is contained in:
Xargin 2019-01-01 20:44:53 +08:00
parent d153a2b6c4
commit 587f533b67

View File

@ -6,7 +6,7 @@
*图 5-10 validator流程*
实际上这是一个语言无关的场景需要进行字段校验的情况有很多Web系统的Form或JSON提交只是一个典型的例子。我们用go来写一个类似上图的校验demo。然后研究怎么一步步对其进行改进。
实际上这是一个语言无关的场景需要进行字段校验的情况有很多Web系统的Form或JSON提交只是一个典型的例子。我们用Go来写一个类似上图的校验示例。然后研究怎么一步步对其进行改进。
## 5.4.1 重构请求校验函数
@ -106,7 +106,7 @@ func validate(req RegisterReq) error {
```
这样就不需要在每个请求进入业务逻辑之前都写重复的`validate()`函数了。本例中只列出了这个validator非常简单的几个功能。
这样就不需要在每个请求进入业务逻辑之前都写重复的`validate()`函数了。本例中只列出了这个校验器非常简单的几个功能。
我们试着跑一下这个程序,输入参数设置为:
@ -151,7 +151,7 @@ type T struct {
从字段校验的需求来讲,无论我们采用深度优先搜索还是广度优先搜索来对这棵结构体树来进行遍历,都是可以的。
我们来写一个递归的深度优先搜索方式的遍历demo
我们来写一个递归的深度优先搜索方式的遍历示例
```go
package main
@ -235,8 +235,8 @@ func main() {
}
```
这里我们简单地对`eq=x``email`这两个tag进行了支持读者可以对这个程序进行简单的修改以查看具体的validate效果。为了演示精简掉了错误处理和复杂情况的处理例如`reflect.Int8/16/32/64``reflect.Ptr`等类型的处理,如果给生产环境编写validate库的话,请务必做好功能的完善和容错。
这里我们简单地对`eq=x``email`这两个tag进行了支持读者可以对这个程序进行简单的修改以查看具体的validate效果。为了演示精简掉了错误处理和复杂情况的处理例如`reflect.Int8/16/32/64``reflect.Ptr`等类型的处理,如果给生产环境编写校验库的话,请务必做好功能的完善和容错。
在前一小节中介绍的validator组件在功能上要远比我们这里的例子复杂的多。但原理很简单,就是用反射对结构体进行树形遍历。有心的读者这时候可能会产生一个问题,我们对结构体进行validate时大量使用了反射而go的反射在性能上不太出众有时甚至会影响到我们程序的性能。这样的考虑确实有一些道理但需要对结构体进行大量校验的场景往往出现在Web服务这里并不一定是程序的性能瓶颈所在实际的效果还是要从pprof中做更精确的判断。
在前一小节中介绍的开源校验组件在功能上要远比我们这里的例子复杂的多。但原理很简单,就是用反射对结构体进行树形遍历。有心的读者这时候可能会产生一个问题,我们对结构体进行校验时大量使用了反射而Go的反射在性能上不太出众有时甚至会影响到我们程序的性能。这样的考虑确实有一些道理但需要对结构体进行大量校验的场景往往出现在Web服务这里并不一定是程序的性能瓶颈所在实际的效果还是要从pprof中做更精确的判断。
如果基于反射的validator真的成为了你服务的性能瓶颈怎么办现在也有一种思路可以避免反射使用Go内置的Parser对源代码进行扫描然后根据结构体的定义生成校验代码。我们可以将所有需要校验的结构体放在单独的包内。这就交给读者自己去探索了。
如果基于反射的校验真的成为了你服务的性能瓶颈怎么办现在也有一种思路可以避免反射使用Go内置的Parser对源代码进行扫描然后根据结构体的定义生成校验代码。我们可以将所有需要校验的结构体放在单独的包内。这就交给读者自己去探索了。