回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,6 +1,6 @@
## 5.5. 函
## 5.5. 函
在Go中被看作第一first-class values像其他值一樣,擁有類型,可以被賦值給其他量,傳遞給函數,從函數返迴。對函數function value調用類似函數調用。例子如下:
在Go中被看作第一first-class values像其他值一样,拥有类型,可以被赋值给其他量,传递给函数,从函数返回。对函数function value调用类似函数调用。例子如下:
```Go
func square(n int) int { return n * n }
@@ -17,14 +17,14 @@
f = product // compile error: can't assign func(int, int) int to func(int) int
```
數類型的零值是nil。調用值nil的函數值會引起panic錯誤
数类型的零值是nil。用值nil的函数值会引起panic错误
```Go
var f func(int) int
f(3) // 此f的值nil, 引起panic錯誤
f(3) // 此f的值nil, 引起panic错误
```
值可以nil比
值可以nil比
```Go
var f func(int) int
@@ -33,9 +33,9 @@
}
```
但是函值之是不可比的,也不能用函值作map的key。
但是函值之是不可比的,也不能用函值作map的key。
值使得我們不僅僅可以通過數據來參數化函,亦可通過行爲。標準庫中包含許多這樣的例子。下面的代展示了如何使用這個技巧。strings.Map字符串中的每字符調用add1函數,併將每個add1函的返迴值組成一新的字符串返迴給調用者。
值使得我们不仅仅可以通过数据来参数化函,亦可通过行为。标准库中包含许多这样的例子。下面的代展示了如何使用这个技巧。strings.Map字符串中的每字符用add1函数,并将每个add1函的返回值组成一新的字符串返回给调用者。
```Go
func add1(r rune) rune { return r + 1 }
@@ -45,14 +45,14 @@
fmt.Println(strings.Map(add1, "Admix")) // "Benjy"
```
5.2的findLinks函使用了助函visit,遍和操作了HTML面的所有結點。使用函值,我可以將遍歷結點的邏輯和操作結點的邏輯分離,使得我可以用遍歷的邏輯,從而對結點進行不同的操作。
5.2的findLinks函使用了助函visit,遍和操作了HTML面的所有结点。使用函值,我可以将遍历结点的逻辑和操作结点的逻辑分离,使得我可以用遍历的逻辑,从而对结点进行不同的操作。
<u><i>gopl.io/ch5/outline2</i></u>
```Go
// forEachNode針對每個結點x,都會調用pre(x)和post(x)。
// pre和post都是可的。
// 遍孩子結點之前,pre被調
// 遍孩子結點之後post被調
// forEachNode针对每个结点x,都会调用pre(x)和post(x)。
// pre和post都是可的。
// 遍孩子结点之前,pre被
// 遍孩子结点之后post被
func forEachNode(n *html.Node, pre, post func(n *html.Node)) {
if pre != nil {
pre(n)
@@ -66,7 +66,7 @@ func forEachNode(n *html.Node, pre, post func(n *html.Node)) {
}
```
該函數接收2個函數作爲參數,分别在結點的孩子被訪問前和訪問後調用。這樣的設計給調用者更大的活性。舉個例子,在我有startElemen和endElement兩個函數用於輸出HTML元素的開始標籤和結束標籤`<b>...</b>`
该函数接收2个函数作为参数,分别在结点的孩子被访问前和访问后调用。这样的设计给调用者更大的活性。举个例子,在我有startElemen和endElement两个函数用于输出HTML元素的开始标签和结束标签`<b>...</b>`
```Go
var depth int
@@ -84,15 +84,15 @@ func endElement(n *html.Node) {
}
```
上面的代利用fmt.Printf的一小技巧控製輸出的縮進`%*s`中的`*`在字符串之前填充一些空格。在例子中,每次輸出會先填充`depth*2`量的空格,再出"",最後再輸出HTML標籤
上面的代利用fmt.Printf的一小技巧控制输出的缩进`%*s`中的`*`在字符串之前填充一些空格。在例子中,每次输出会先填充`depth*2`量的空格,再出"",最后再输出HTML标签
如果我像下面這樣調用forEachNode
如果我像下面这样调用forEachNode
```Go
forEachNode(doc, startElement, endElement)
```
之前的outline程序相比得到了更加詳細的頁面結構
之前的outline程序相比得到了更加详细的页面结构
```
$ go build gopl.io/ch5/outline2
@@ -117,15 +117,15 @@ $ ./outline2 http://gopl.io
...
```
**練習 5.7** 完善startElement和endElement函,使其成通用的HTML出器。要求:輸出註釋結點,文本結點以及每元素的性(< a href='...'>)。使用略格式輸出沒有孩子結點的元素(`<img/>`代替`<img></img>`)。編寫測試,驗證程序出的格式正。(詳見11章
**练习 5.7** 完善startElement和endElement函,使其成通用的HTML出器。要求:输出注释结点,文本结点以及每元素的性(< a href='...'>)。使用略格式输出没有孩子结点的元素(`<img/>`代替`<img></img>`)。编写测试,验证程序出的格式正。(详见11章
**練習 5.8** 改pre和post函,使其返迴布爾類型的返值。返false中止forEachNoded的遍。使用脩改後的代碼編寫ElementByID函,根據用戶輸入的id找第一個擁有該id元素的HTML元素找成功,停止遍
**练习 5.8** 改pre和post函,使其返回布尔类型的返值。返false中止forEachNoded的遍。使用修改后的代码编写ElementByID函,根据用户输入的id找第一个拥有该id元素的HTML元素找成功,停止遍
```Go
func ElementByID(doc *html.Node, id string) *html.Node
```
**練習 5.9** 編寫函數expands中的"foo"替換爲f("foo")的返值。
**练习 5.9** 编写函数expands中的"foo"替换为f("foo")的返值。
```Go
func expand(s string, f func(string) string) string