修复代码前的包路径

This commit is contained in:
chai2010 2016-01-20 21:08:13 +08:00
parent 5f22549aa0
commit 36784e0645
7 changed files with 14 additions and 21 deletions

View File

@ -2,8 +2,8 @@
我們以現已成爲傳統的“hello world”案例來開始吧, 這個例子首次出現於1978年出版的C語言聖經[《The C Programming Language》](http://s3-us-west-2.amazonaws.com/belllabs-microsite-dritchie/cbook/index.html)[^1]。C語言是直接影響Go語言設計的語言之一。這個例子體現了Go語言一些核心理念。 我們以現已成爲傳統的“hello world”案例來開始吧, 這個例子首次出現於1978年出版的C語言聖經[《The C Programming Language》](http://s3-us-west-2.amazonaws.com/belllabs-microsite-dritchie/cbook/index.html)[^1]。C語言是直接影響Go語言設計的語言之一。這個例子體現了Go語言一些核心理念。
<u><i>gopl.io/ch1/helloworld</i></u>
```go ```go
gopl.io/ch1/helloworld
package main package main
import "fmt" import "fmt"

View File

@ -10,8 +10,8 @@ os.Args的第一個元素卽os.Args[0]是命令行執行時的命令本身;
下面是一個Unix里echo命令的實現這個命令會在單行內打印出命令行參數。程序中import了兩個package併且用括號把這兩個package包了起來這是import多個package時的簡化寫法。當然了分開寫import也沒有什麽問題隻是這麽寫更加方便。這里的導入順序併不重要因爲gofmt工具格式化時會按照字母順序來排列好這些被導入的包名。本書中代碼范例的不同版本會用編號來標記 下面是一個Unix里echo命令的實現這個命令會在單行內打印出命令行參數。程序中import了兩個package併且用括號把這兩個package包了起來這是import多個package時的簡化寫法。當然了分開寫import也沒有什麽問題隻是這麽寫更加方便。這里的導入順序併不重要因爲gofmt工具格式化時會按照字母順序來排列好這些被導入的包名。本書中代碼范例的不同版本會用編號來標記
<u><i>gopl.io/ch1/echo1</i></u>
```go ```go
gopl.io/ch1/echo1
// Echo1 prints its command-line arguments. // Echo1 prints its command-line arguments.
package main package main
@ -96,8 +96,8 @@ for {
如果你的遍歷對象是string或者slice類型值的話還有另外一種循環的寫法我們來看看另一個版本的echo 如果你的遍歷對象是string或者slice類型值的話還有另外一種循環的寫法我們來看看另一個版本的echo
<u><i>gopl.io/ch1/echo2</i></u>
```go ```go
gopl.io/ch1/echo2
// Echo2 prints its command-line arguments. // Echo2 prints its command-line arguments.
package main package main
@ -134,8 +134,8 @@ var s string = ""
如果不斷連接的字符串數量衆多那麽上面這種操作就是成本非常高的操作。更簡單併且有效的一種方式是使用strings包提供的Join函數像下面這樣 如果不斷連接的字符串數量衆多那麽上面這種操作就是成本非常高的操作。更簡單併且有效的一種方式是使用strings包提供的Join函數像下面這樣
<u><i>gopl.io/ch1/echo3</i></u>
```go ```go
gopl.io/ch1/echo3
func main() { func main() {
fmt.Println(strings.Join(os.Args[1:], " ")) fmt.Println(strings.Join(os.Args[1:], " "))
} }
@ -154,4 +154,3 @@ fmt.Println(os.Args[1:])
**練習 1.2** 脩改echo程序使其打印value和index每個value和index顯示一行。 **練習 1.2** 脩改echo程序使其打印value和index每個value和index顯示一行。
**練習 1.3** 上手實踐前面提到的strings.Join和直接Println併觀察輸出結果的區别。 **練習 1.3** 上手實踐前面提到的strings.Join和直接Println併觀察輸出結果的區别。

View File

@ -4,8 +4,8 @@
第一個版本的dup輸出標準輸入流中的出現多次的行在行內容前是出現次數的計數。這個程序將引入if表達式map內置數據結構和bufio的package。 第一個版本的dup輸出標準輸入流中的出現多次的行在行內容前是出現次數的計數。這個程序將引入if表達式map內置數據結構和bufio的package。
<u><i>gopl.io/ch1/dup1</i></u>
```go ```go
gopl.io/ch1/dup1
// Dup1 prints the text of each line that appears more than // Dup1 prints the text of each line that appears more than
// once in the standard input, preceded by its count. // once in the standard input, preceded by its count.
package main package main
@ -78,8 +78,8 @@ dup1中的程序還出現了\t和\n的格式化字符串。這些特殊的轉義
很多程序像上面的例子一樣從標準輸入中讀取數據但輸入源有時還可能是一些文件。下面的dup程序從標準輸入得到一些文件名然後用os.Open函數來打開每一個文件獲取內容。 很多程序像上面的例子一樣從標準輸入中讀取數據但輸入源有時還可能是一些文件。下面的dup程序從標準輸入得到一些文件名然後用os.Open函數來打開每一個文件獲取內容。
<u><i>gopl.io/ch1/dup2</i></u>
```go ```go
gopl.io/ch1/dup2
// Dup2 prints the count and text of lines that appear more than once // Dup2 prints the count and text of lines that appear more than once
// in the input. It reads from stdin or from a list of named files. // in the input. It reads from stdin or from a list of named files.
package main package main
@ -136,8 +136,8 @@ os.Open返迴的第二個值是一個Go語言內置的error類型。如果這個
我們簡化了dup3這個程序。首先它隻讀取命名的文件而不去讀標準輸入因爲ReadFile函數需要一個文件名參數。其次我們將行計數邏輯移迴到了main函數因爲現在這個邏輯隻有一個地方需要用到。 我們簡化了dup3這個程序。首先它隻讀取命名的文件而不去讀標準輸入因爲ReadFile函數需要一個文件名參數。其次我們將行計數邏輯移迴到了main函數因爲現在這個邏輯隻有一個地方需要用到。
<u><i>gopl.io/ch1/dup3</i></u>
```go ```go
gopl.io/ch1/dup3
package main package main
import ( import (
@ -172,4 +172,3 @@ ReadFile函數返迴byte類型的slice這個slice必須被轉換爲string
在更底層一些的地方bufio.Scannerioutil.ReadFile和ioutil.WriteFile使用的都是*os.File的Read和Write方法不過一般程序員併不需要去直接了解到其底層實現細節在bufio和io/ioutil包中提供的方法已經足夠好用。 在更底層一些的地方bufio.Scannerioutil.ReadFile和ioutil.WriteFile使用的都是*os.File的Read和Write方法不過一般程序員併不需要去直接了解到其底層實現細節在bufio和io/ioutil包中提供的方法已經足夠好用。
**練習 1.4** 脩改dup2使其可以分别打印重複的行出現在哪些文件。 **練習 1.4** 脩改dup2使其可以分别打印重複的行出現在哪些文件。

View File

@ -10,9 +10,8 @@
這段代碼里我們用了一些新的結構包括const聲明struct結構體類型複合聲明。和我們舉的其它的例子不太一樣這一個例子包含了浮點數運算。這些概念我們隻在這里簡單地説明一下之後的章節會更詳細地講解。 這段代碼里我們用了一些新的結構包括const聲明struct結構體類型複合聲明。和我們舉的其它的例子不太一樣這一個例子包含了浮點數運算。這些概念我們隻在這里簡單地説明一下之後的章節會更詳細地講解。
<u><i>gopl.io/ch1/lissajous</i></u>
```go ```go
gopl.io/ch1/lissajous
// Lissajous generates GIF animations of random Lissajous figures. // Lissajous generates GIF animations of random Lissajous figures.
package main package main
@ -89,4 +88,3 @@ $ ./lissajous >out.gif
**練習 1.5** 脩改前面的Lissajous程序里的調色闆由緑色改爲黑色。我們可以用color.RGBA{0xRR, 0xGG, 0xBB}來得到#RRGGBB這個色值三個十六進製的字符串分别代表紅、緑、藍像素。 **練習 1.5** 脩改前面的Lissajous程序里的調色闆由緑色改爲黑色。我們可以用color.RGBA{0xRR, 0xGG, 0xBB}來得到#RRGGBB這個色值三個十六進製的字符串分别代表紅、緑、藍像素。
**練習 1.6** 脩改Lissajous程序脩改其調色闆來生成更豐富的顔色然後脩改SetColorIndex的第三個參數看看顯示結果吧。 **練習 1.6** 脩改Lissajous程序脩改其調色闆來生成更豐富的顔色然後脩改SetColorIndex的第三個參數看看顯示結果吧。

View File

@ -4,8 +4,8 @@
爲了最簡單地展示基於HTTP獲取信息的方式下面給出一個示例程序fetch這個程序將獲取對應的url併將其源文本打印出來這個例子的靈感來源於curl工具譯註unix下的一個用來發http請求的工具具體可以man curl。當然curl提供的功能更爲複雜豐富這里隻編寫最簡單的樣例。這個樣例之後還會多次被用到。 爲了最簡單地展示基於HTTP獲取信息的方式下面給出一個示例程序fetch這個程序將獲取對應的url併將其源文本打印出來這個例子的靈感來源於curl工具譯註unix下的一個用來發http請求的工具具體可以man curl。當然curl提供的功能更爲複雜豐富這里隻編寫最簡單的樣例。這個樣例之後還會多次被用到。
<u><i>gopl.io/ch1/fetch</i></u>
```go ```go
gopl.io/ch1/fetch
// Fetch prints the content found at a URL. // Fetch prints the content found at a URL.
package main package main
@ -66,4 +66,3 @@ fetch: Get http://gopl.io: dial tcp: lookup gopl.io: getaddrinfow: No such host
**練習 1.8** 脩改fetch這個范例如果輸入的url參數沒有 `http://` 前綴的話爲這個url加上該前綴。你可能會用到strings.HasPrefix這個函數。 **練習 1.8** 脩改fetch這個范例如果輸入的url參數沒有 `http://` 前綴的話爲這個url加上該前綴。你可能會用到strings.HasPrefix這個函數。
**練習 1.9** 脩改fetch打印出HTTP協議的狀態碼可以從resp.Status變量得到該狀態碼。 **練習 1.9** 脩改fetch打印出HTTP協議的狀態碼可以從resp.Status變量得到該狀態碼。

View File

@ -4,8 +4,8 @@ Go語言最有意思併且最新奇的特性就是對併發編程的支持。併
下面的例子fetchall和前面小節的fetch程序所要做的工作基本一致fetchall的特别之處在於它會同時去獲取所有的URL所以這個程序的總執行時間不會超過執行時間最長的那一個任務前面的fetch程序執行時間則是所有任務執行時間之和。fetchall程序隻會打印獲取的內容大小和經過的時間不會像之前那樣打印獲取的內容。 下面的例子fetchall和前面小節的fetch程序所要做的工作基本一致fetchall的特别之處在於它會同時去獲取所有的URL所以這個程序的總執行時間不會超過執行時間最長的那一個任務前面的fetch程序執行時間則是所有任務執行時間之和。fetchall程序隻會打印獲取的內容大小和經過的時間不會像之前那樣打印獲取的內容。
<u><i>gopl.io/ch1/fetchall</i></u>
```go ```go
gopl.io/ch1/fetchall
// Fetchall fetches URLs in parallel and reports their times and sizes. // Fetchall fetches URLs in parallel and reports their times and sizes.
package main package main

View File

@ -2,8 +2,8 @@
Go語言的內置庫使得寫一個類似fetch的web服務器變得異常地簡單。在本節中我們會展示一個微型服務器這個服務器的功能是返迴當前用戶正在訪問的URL。比如用戶訪問的是 http://localhost:8000/hello 那麽響應是URL.Path = "hello"。 Go語言的內置庫使得寫一個類似fetch的web服務器變得異常地簡單。在本節中我們會展示一個微型服務器這個服務器的功能是返迴當前用戶正在訪問的URL。比如用戶訪問的是 http://localhost:8000/hello 那麽響應是URL.Path = "hello"。
<u><i>gopl.io/ch1/server1</i></u>
```go ```go
gopl.io/ch1/server1
// Server1 is a minimal "echo" server. // Server1 is a minimal "echo" server.
package main package main
@ -48,8 +48,8 @@ URL.Path = "/help"
在這個服務的基礎上疊加特性是很容易的。一種比較實用的脩改是爲訪問的url添加某種狀態。比如下面這個版本輸出了同樣的內容但是會對請求的次數進行計算對URL的請求結果會包含各種URL被訪問的總次數直接對/count這個URL的訪問要除外。 在這個服務的基礎上疊加特性是很容易的。一種比較實用的脩改是爲訪問的url添加某種狀態。比如下面這個版本輸出了同樣的內容但是會對請求的次數進行計算對URL的請求結果會包含各種URL被訪問的總次數直接對/count這個URL的訪問要除外。
<u><i>gopl.io/ch1/server2</i></u>
```go ```go
gopl.io/ch1/server2
// Server2 is a minimal "echo" and counter server. // Server2 is a minimal "echo" and counter server.
package main package main
@ -89,8 +89,8 @@ func counter(w http.ResponseWriter, r *http.Request) {
下面是一個更爲豐富的例子handler函數會把請求的http頭和請求的form數據都打印出來這樣可以使檢査和調試這個服務更爲方便 下面是一個更爲豐富的例子handler函數會把請求的http頭和請求的form數據都打印出來這樣可以使檢査和調試這個服務更爲方便
<u><i>gopl.io/ch1/server3</i></u>
```go ```go
gopl.io/ch1/server3
// handler echoes the HTTP request. // handler echoes the HTTP request.
func handler(w http.ResponseWriter, r *http.Request) { func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%s %s %s\n", r.Method, r.URL, r.Proto) fmt.Fprintf(w, "%s %s %s\n", r.Method, r.URL, r.Proto)
@ -156,8 +156,6 @@ HandleFunc函數的第二個參數是一個函數的字面值也就是一個
做完這些脩改之後,在瀏覽器里訪問 http://localhost:8000 。每次你載入這個頁面都可以看到一個像圖1.3那樣的動畵。 做完這些脩改之後,在瀏覽器里訪問 http://localhost:8000 。每次你載入這個頁面都可以看到一個像圖1.3那樣的動畵。
**練習 1.12** 脩改Lissajour服務從URL讀取變量比如你可以訪問 http://localhost:8000/?cycles=20 這個URL這樣訪問可以將程序里的cycles默認的5脩改爲20。字符串轉換爲數字可以調用strconv.Atoi函數。你可以在godoc里査看strconv.Atoi的詳細説明。
![](../images/ch1-03.png) ![](../images/ch1-03.png)
**練習 1.12** 脩改Lissajour服務從URL讀取變量比如你可以訪問 http://localhost:8000/?cycles=20 這個URL這樣訪問可以將程序里的cycles默認的5脩改爲20。字符串轉換爲數字可以調用strconv.Atoi函數。你可以在godoc里査看strconv.Atoi的詳細説明。