From 9d18f6ea5c7c5cff75342e922ad7f820a3f73708 Mon Sep 17 00:00:00 2001 From: Xargin Date: Fri, 2 Mar 2018 19:32:57 +0800 Subject: [PATCH] validator done --- ch6-web/ch6-04-validator.md | 18 +++++++++++++++--- images/ch6-04-validate-struct-tree.png | Bin 0 -> 17020 bytes 2 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 images/ch6-04-validate-struct-tree.png diff --git a/ch6-web/ch6-04-validator.md b/ch6-web/ch6-04-validator.md index dac8f84..48b7932 100644 --- a/ch6-web/ch6-04-validator.md +++ b/ch6-web/ch6-04-validator.md @@ -123,11 +123,23 @@ fmt.Println(err) // Key: 'RegisterReq.PasswordRepeat' Error:Field validation for ## 原理 -从结构上来看,每一个 struct 都可以看成是一棵树。i +从结构上来看,每一个 struct 都可以看成是一棵树。假如我们有如下定义的 struct: -## TODO 这里需要一张图 +```go +type Nested struct { + Email string `validate:"email"` +} +type T struct { + Age int `validate:"eq=10"` + Nested Nested +} +``` -从字段校验这个角度来讲,无论我们采用深度优先搜索还是广度优先搜索来对这棵 struct 树来进行遍历,都是可以的。 +把这个 struct 画成一棵树: + +![struct-tree](../images/ch6-04-validate-struct-tree.png) + +从字段校验的需求来讲,无论我们采用深度优先搜索还是广度优先搜索来对这棵 struct 树来进行遍历,都是可以的。 我们来写一个递归的深度优先搜索方式的遍历 demo: diff --git a/images/ch6-04-validate-struct-tree.png b/images/ch6-04-validate-struct-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..38d82d67919e4bdcc71fcf9a02bc9a8c617d83bb GIT binary patch literal 17020 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 b