mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2024-12-01 02:28:56 +00:00
修复代码前的包路径
This commit is contained in:
parent
5f22549aa0
commit
36784e0645
@ -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"
|
||||||
|
@ -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,併觀察輸出結果的區别。
|
||||||
|
|
||||||
|
@ -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.Scanner,ioutil.ReadFile和ioutil.WriteFile使用的都是*os.File的Read和Write方法,不過一般程序員併不需要去直接了解到其底層實現細節,在bufio和io/ioutil包中提供的方法已經足夠好用。
|
在更底層一些的地方,bufio.Scanner,ioutil.ReadFile和ioutil.WriteFile使用的都是*os.File的Read和Write方法,不過一般程序員併不需要去直接了解到其底層實現細節,在bufio和io/ioutil包中提供的方法已經足夠好用。
|
||||||
|
|
||||||
**練習 1.4:** 脩改dup2,使其可以分别打印重複的行出現在哪些文件。
|
**練習 1.4:** 脩改dup2,使其可以分别打印重複的行出現在哪些文件。
|
||||||
|
|
||||||
|
@ -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的第三個參數,看看顯示結果吧。
|
||||||
|
|
||||||
|
@ -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變量得到該狀態碼。
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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的詳細説明。
|
||||||
|
Loading…
Reference in New Issue
Block a user