Compare commits

...

6 Commits

Author SHA1 Message Date
Xargin
0ce59f2c29 Merge pull request #97 from szhnet/patch-1
Update ch12-06.md
2021-11-23 19:06:43 +08:00
Xargin
0c0deebddd Merge pull request #98 from lamb/patch-1
Update ch1-02.md
2021-11-23 19:06:10 +08:00
Xargin
fcdbd6d94d Merge pull request #99 from szhnet/patch-2
Update ch12-08.md
2021-11-23 19:05:40 +08:00
szh
519958e610 Update ch12-08.md
修正笔误
2021-11-17 17:39:40 +08:00
金氧
d0400d8d66 Update ch1-02.md
修正缺少语言的语字
2021-11-16 17:02:38 +08:00
szh
30e9fc544f Update ch12-06.md
修正笔误
2021-11-09 15:53:08 +08:00
3 changed files with 4 additions and 4 deletions

View File

@@ -4,7 +4,7 @@
`os`包以跨平台的方式提供了一些与操作系统交互的函数和变量。程序的命令行参数可从os包的Args变量获取os包外部使用os.Args访问该变量。
os.Args变量是一个字符串string的*切片*slice译注slice和Python语言中的切片类似是一个简版的动态数组切片是Go语言的基础概念稍后详细介绍。现在先把切片s当作数组元素序列序列的长度动态变化`s[i]`访问单个元素,用`s[m:n]`获取子序列译注和python里的语法差不多。序列的元素数目为len(s)。和大多数编程语言类似区间索引时Go言里也采用左闭右开形式区间包括第一个索引元素不包括最后一个因为这样可以简化逻辑。译注比如a = [1, 2, 3, 4, 5], a[0:3] = [1, 2, 3]不包含最后一个元素。比如s[m:n]这个切片0 ≤ m ≤ n ≤ len(s)包含n-m个元素。
os.Args变量是一个字符串string的*切片*slice译注slice和Python语言中的切片类似是一个简版的动态数组切片是Go语言的基础概念稍后详细介绍。现在先把切片s当作数组元素序列序列的长度动态变化`s[i]`访问单个元素,用`s[m:n]`获取子序列译注和python里的语法差不多。序列的元素数目为len(s)。和大多数编程语言类似区间索引时Go言里也采用左闭右开形式区间包括第一个索引元素不包括最后一个因为这样可以简化逻辑。译注比如a = [1, 2, 3, 4, 5], a[0:3] = [1, 2, 3]不包含最后一个元素。比如s[m:n]这个切片0 ≤ m ≤ n ≤ len(s)包含n-m个元素。
os.Args的第一个元素os.Args[0]是命令本身的名字其它的元素则是程序启动时传给它的参数。s[m:n]形式的切片表达式产生从第m个元素到第n-1个元素的切片下个例子用到的元素包含在os.Args[1:len(os.Args)]切片中。如果省略切片表达式的m或n会默认传入0或len(s)因此前面的切片可以简写成os.Args[1:]。

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的末尾。

View File

@@ -18,7 +18,7 @@ func Print(x interface{}) {
}
```
reflect.Type和reflect.Value都提供了一个Method方法。每次t.Method(i)调用将一个reflect.Method的实例对应一个用于描述一个方法的名称和类型的结构体。每次v.Method(i)方法调用都返回一个reflect.Value以表示对应的值§6.4),也就是一个方法是到它的接收者的。使用reflect.Value.Call方法我们这里没有演示将可以调用一个Func类型的Value但是这个例子中只用到了它的类型。
reflect.Type和reflect.Value都提供了一个Method方法。每次t.Method(i)调用将一个reflect.Method的实例对应一个用于描述一个方法的名称和类型的结构体。每次v.Method(i)方法调用都返回一个reflect.Value以表示对应的值§6.4),也就是一个方法是到它的接收者的。使用reflect.Value.Call方法我们这里没有演示将可以调用一个Func类型的Value但是这个例子中只用到了它的类型。
这是属于time.Duration和`*strings.Replacer`两个类型的方法: