mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-12-18 19:54:21 +08:00
ch5: fix code path
This commit is contained in:
@@ -10,8 +10,8 @@ strings.Map(func(r rune) rune { return r + 1 }, "HAL-9000")
|
||||
|
||||
更爲重要的是,通過這種方式定義的函數可以訪問完整的詞法環境(lexical environment),這意味着在函數中定義的內部函數可以引用該函數的變量,如下例所示:
|
||||
|
||||
<u><i>gopl.io/ch5/squares</i></u>
|
||||
```Go
|
||||
gopl.io/ch5/squares
|
||||
// squares返迴一個匿名函數。
|
||||
// 該匿名函數每次被調用時都會返迴下一個數的平方。
|
||||
func squares() func() int {
|
||||
@@ -38,8 +38,8 @@ squares的例子證明,函數值不僅僅是一串代碼,還記録了狀態
|
||||
|
||||
接下來,我們討論一個有點學術性的例子,考慮這樣一個問題:給定一些計算機課程,每個課程都有前置課程,隻有完成了前置課程才可以開始當前課程的學習;我們的目標是選擇出一組課程,這組課程必須確保按順序學習時,能全部被完成。每個課程的前置課程如下:
|
||||
|
||||
<u><i>gopl.io/ch5/toposort</i></u>
|
||||
```Go
|
||||
gopl.io/ch5/toposort
|
||||
// prereqs記録了每個課程的前置課程
|
||||
var prereqs = map[string][]string{
|
||||
"algorithms": {"data structures"},
|
||||
@@ -121,8 +121,8 @@ visitAll := func(items []string) {
|
||||
|
||||
讓我們迴到findLinks這個例子。我們將代碼移動到了links包下,將函數重命名爲Extract,在第八章我們會再次用到這個函數。新的匿名函數被引入,用於替換原來的visit函數。該匿名函數負責將新連接添加到切片中。在Extract中,使用forEachNode遍歷HTML頁面,由於Extract隻需要在遍歷結點前操作結點,所以forEachNode的post參數被傳入nil。
|
||||
|
||||
<u><i>gopl.io/ch5/links</i></u>
|
||||
```Go
|
||||
gopl.io/ch5/links
|
||||
// Package links provides a link-extraction function.
|
||||
package links
|
||||
import (
|
||||
@@ -172,8 +172,8 @@ func Extract(url string) ([]string, error) {
|
||||
|
||||
下面的函數實現了廣度優先算法。調用者需要輸入一個初始的待訪問列表和一個函數f。待訪問列表中的每個元素被定義爲string類型。廣度優先算法會爲每個元素調用一次f。每次f執行完畢後,會返迴一組待訪問元素。這些元素會被加入到待訪問列表中。當待訪問列表中的所有元素都被訪問後,breadthFirst函數運行結束。爲了避免同一個元素被訪問兩次,代碼中維護了一個map。
|
||||
|
||||
<u><i>gopl.io/ch5/findlinks3</i></u>
|
||||
```Go
|
||||
gopl.io/ch5/findlinks3
|
||||
// breadthFirst calls f for each item in the worklist.
|
||||
// Any items returned by f are added to the worklist.
|
||||
// f is called at most once for each item.
|
||||
@@ -219,7 +219,7 @@ func main() {
|
||||
|
||||
讓我們從 https://golang.org 開始,下面是程序的輸出結果:
|
||||
|
||||
```bash
|
||||
```
|
||||
$ go build gopl.io/ch5/findlinks3
|
||||
$ ./findlinks3 https://golang.org
|
||||
https://golang.org/
|
||||
|
||||
Reference in New Issue
Block a user