Merge pull request #97 from szhnet/patch-1

Update ch12-06.md
This commit is contained in:
Xargin 2021-11-23 19:06:43 +08:00 committed by GitHub
commit 0ce59f2c29
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -67,9 +67,9 @@ func read(lex *lexer, v reflect.Value) {
}
```
我们的S表达式使用标识符区分两个不同类型结构体成员名和nil值的指针。read函数值处理nil类型的标识符。当遇到scanner.Ident为“nil”使用reflect.Zero函数将变量v设置为零值。而其它任何类型的标识符我们都作为错误处理。后面的readList函数将处理结构体的成员名。
我们的S表达式使用标识符区分两个不同类型结构体成员名和nil值的指针。read函数值处理nil类型的标识符。当遇到scanner.Ident为“nil”使用reflect.Zero函数将变量v设置为零值。而其它任何类型的标识符我们都作为错误处理。后面的readList函数将处理结构体的成员名。
一个“(”标记对应一个列表的开始。第二个函数readList将一个列表解码到一个聚合类型中map、结构体、slice或数组具体类型依于传入待填充变量的类型。每次遇到这种情况,循环继续解析每个元素直到遇到于开始标记匹配的结束标记“)”endList函数用于检测结束标记。
一个“(”标记对应一个列表的开始。第二个函数readList将一个列表解码到一个聚合类型中map、结构体、slice或数组具体类型依于传入待填充变量的类型。每次遇到这种情况,循环继续解析每个元素直到遇到于开始标记匹配的结束标记“)”endList函数用于检测结束标记。
最有趣的部分是递归。最简单的是对数组类型的处理。直到遇到“)”结束标记我们使用Index函数来获取数组每个元素的地址然后递归调用read函数处理。和其它错误类似如果输入数据导致解码器的引用超出了数组的范围解码器将抛出panic异常。slice也采用类似方法解析不同的是我们将为每个元素创建新的变量然后将元素添加到slice的末尾。