diff --git a/ch1/ch1-04.md b/ch1/ch1-04.md index 07b8334..298cf8f 100644 --- a/ch1/ch1-04.md +++ b/ch1/ch1-04.md @@ -75,7 +75,7 @@ bla kIndex) gif.GIF是一個struct類型(參考4.4節)。struct是一組值或者叫字段的集合,不同的類型集合在一個struct可以讓我們以一個統一的單元進行處理。anim是一個gif.GIF類型的struct變量。這種寫法會生成一個struct變量,併且其內部變量LoopCount字段會被設置爲nframes;而其它的字段會被設置爲各自類型默認的零值。struct內部的變量可以以一個點(.)來進行訪問,就像在最後兩個賦值語句中顯式地更新了anim這個struct的Delay和Image字段。 -lissajous函數內部有兩層嵌套的for循環。外層循環會循環64次,每一次都會生成一個單獨的動畵幀。它生成了一個包含兩種顔色的201&201大小的圖片,白色和黑色。所有像素點都會被默認設置爲其零值(也就是palette里的第0個值),這里我們設置的是白色。每次經過內存循環都會通過設置像素爲黑色,生成一張新圖片。其結果會append到之前結果之後。這里我們用到了append(參考4.2.1)這個內置函數,將結果appen到anim中的幀列表末尾,併會設置一個默認的80ms的延遲值。最終循環結束,所有的延遲值也被編碼進了GIF圖片中,併將結果寫入到輸出流。out這個變量是io.Writer類型,這個類型讓我們可以可以讓我們把輸出結果寫到很多目標,很快我們就可以看到了。 +lissajous函數內部有兩層嵌套的for循環。外層循環會循環64次,每一次都會生成一個單獨的動畵幀。它生成了一個包含兩種顔色的201&201大小的圖片,白色和黑色。所有像素點都會被默認設置爲其零值(也就是palette里的第0個值),這里我們設置的是白色。每次外層循環都會生成一張新圖片,併將一些像素設置爲黑色。其結果會append到之前結果之後。這里我們用到了append(參考4.2.1)這個內置函數,將結果appen到anim中的幀列表末尾,併會設置一個默認的80ms的延遲值。最終循環結束,所有的延遲值也被編碼進了GIF圖片中,併將結果寫入到輸出流。out這個變量是io.Writer類型,這個類型讓我們可以可以讓我們把輸出結果寫到很多目標,很快我們就可以看到了。 內存循環設置了兩個偏振。x軸偏振使用的是一個sin函數。y軸偏振也是一個正絃波,但是其其相對x軸的偏振是一個0-3的隨機值,併且初始偏振值是一個零值,併隨着動畵的每一幀逐漸增加。循環會一直跑到x軸完成五次完整的循環。每一步它都會調用SetColorIndex來爲(x, y)點來染黑色。 diff --git a/ch12/ch12-06.md b/ch12/ch12-06.md index ed3c8c8..caa5bc3 100644 --- a/ch12/ch12-06.md +++ b/ch12/ch12-06.md @@ -153,7 +153,7 @@ func Unmarshal(data []byte, out interface{}) (err error) { 生産實現不應該對任何輸入問題都用panic形式報告,而且應該報告一些錯誤相關的信息,例如出現錯誤輸入的行號和位置等。盡管如此,我們希望通過這個例子來展示類似encoding/json等包底層代碼的實現思路,以及如何使用反射機製來填充數據結構。 -**練習 12.8:** sexpr.Unmarshal函數和json.Marshal一樣(譯註:這可能是筆誤,我覺得應該是指`json.Unmarshal`函數),都要求在解碼前輸入完整的字節slice。定義一個和json.Decoder類似的sexpr.Decoder類型,支持從一個io.Reader流解碼。脩改sexpr.Unmarshal函數,使用這個新的類型實現。 +**練習 12.8:** sexpr.Unmarshal函數和json.Unmarshal一樣,都要求在解碼前輸入完整的字節slice。定義一個和json.Decoder類似的sexpr.Decoder類型,支持從一個io.Reader流解碼。脩改sexpr.Unmarshal函數,使用這個新的類型實現。 **練習 12.9:** 編寫一個基於標記的API用於解碼S表達式,參考xml.Decoder(7.14)的風格。你將需要五種類型的標記:Symbol、String、Int、StartList和EndList。 diff --git a/ch2/ch2-05.md b/ch2/ch2-05.md index d5f3dbf..117f3fe 100644 --- a/ch2/ch2-05.md +++ b/ch2/ch2-05.md @@ -56,7 +56,7 @@ fmt.Printf("%g\n", boilingF-CToF(FreezingC)) // "180" °F fmt.Printf("%g\n", boilingF-FreezingC) // compile error: type mismatch ``` -比較運算符`==`和`<`也可以用來比較一個命名類型的變量和另一個有相同類型的變量或有相同底層類型的值做比較。但是如果兩個值有着不同的類型,則不能直接進行比較: +比較運算符`==`和`<`也可以用來比較一個命名類型的變量和另一個有相同類型的變量,或有着相同底層類型的未命名類型的值之間做比較。但是如果兩個值有着不同的類型,則不能直接進行比較: ```Go var c Celsius diff --git a/ch2/ch2-06-1.md b/ch2/ch2-06-1.md index a9463de..2f29829 100644 --- a/ch2/ch2-06-1.md +++ b/ch2/ch2-06-1.md @@ -34,7 +34,7 @@ func main() { } ``` -導入語句將導入的包綁定到一個短小的名字,然後通過該短小的名字就可以引用包中導出的全部內容。上面的導入聲明將允許我們以tempconv.CToF的形式來訪問gopl.io/ch2/tempconv包中的內容。在默認情況下,導入的包綁定到tempconv名字(譯註:這包聲明語句指定的名字),但是我們也可以綁定到另一個名稱,以避免名字衝突(§10.3)。 +導入語句將導入的包綁定到一個短小的名字,然後通過該短小的名字就可以引用包中導出的全部內容。上面的導入聲明將允許我們以tempconv.CToF的形式來訪問gopl.io/ch2/tempconv包中的內容。在默認情況下,導入的包綁定到tempconv名字(譯註:這包聲明語句指定的名字),但是我們也可以綁定到另一個名稱,以避免名字衝突(§10.4)。 cf程序將命令行輸入的一個溫度在Celsius和Fahrenheit溫度單位之間轉換: diff --git a/ch3/ch3-01.md b/ch3/ch3-01.md index f730d77..c9e368b 100644 --- a/ch3/ch3-01.md +++ b/ch3/ch3-01.md @@ -28,7 +28,7 @@ Unicode字符rune類型是和int32等價的類型,通常用於表示一個Unic 對於上表中前兩行的運算符,例如+運算符還有一個與賦值相結合的對應運算符+=,可以用於簡化賦值語句。 -整數的算術運算符+、-、`*`和`/`可以適用與於整數、浮點數和複數,但是取模運算符%僅用於整數間的運算。對於不同編程語言,%取模運算的行爲可能併不相同。在Go語言中,%取模運算符的符號和被取模數的符號總是一致的,因此`-5%3`和`-5%-3`結果都是-2。除法運算符`/`的行爲則依賴於操作數是否爲全爲整數,比如`5.0/4.0`的結果是1.25,但是5/4的結果是1,因爲整數除法會向着0方向截斷餘數。 +算術運算符+、-、`*`和`/`可以適用與於整數、浮點數和複數,但是取模運算符%僅用於整數間的運算。對於不同編程語言,%取模運算的行爲可能併不相同。在Go語言中,%取模運算符的符號和被取模數的符號總是一致的,因此`-5%3`和`-5%-3`結果都是-2。除法運算符`/`的行爲則依賴於操作數是否爲全爲整數,比如`5.0/4.0`的結果是1.25,但是5/4的結果是1,因爲整數除法會向着0方向截斷餘數。 如果一個算術運算的結果,不管是有符號或者是無符號的,如果需要更多的bit位才能正確表示的話,就説明計算結果是溢出了。超出的高位的bit位部分將被丟棄。如果原始的數值是有符號類型,而且最左邊的bit爲是1的話,那麽最終結果可能是負的,例如int8的例子: diff --git a/ch3/ch3-05-4.md b/ch3/ch3-05-4.md index d51c6d4..e8de07b 100644 --- a/ch3/ch3-05-4.md +++ b/ch3/ch3-05-4.md @@ -116,7 +116,7 @@ bytes包還提供了Buffer類型用於字節slice的緩存。一個Buffer開始 ```Go gopl.io/ch3/printints -// intsToString is like fmt.Sprintf(values) but adds commas. +// intsToString is like fmt.Sprint(values) but adds commas. func intsToString(values []int) string { var buf bytes.Buffer buf.WriteByte('[') diff --git a/ch3/ch3-05-5.md b/ch3/ch3-05-5.md index 2d0c176..545a57f 100644 --- a/ch3/ch3-05-5.md +++ b/ch3/ch3-05-5.md @@ -16,7 +16,7 @@ FormatInt和FormatUint函數可以用不同的進製來格式化數字: fmt.Println(strconv.FormatInt(int64(x), 2)) // "1111011" ``` -fmt.Printf函數的%b、%d、%u和%x等參數提供功能往往比strconv包的Format函數方便很多,特别是在需要包含附加額外信息的時候: +fmt.Printf函數的%b、%d、%o和%x等參數提供功能往往比strconv包的Format函數方便很多,特别是在需要包含附加額外信息的時候: ```Go s := fmt.Sprintf("x=%b", x) // "x=1111011" diff --git a/ch3/ch3-06.md b/ch3/ch3-06.md index b6e80d8..c3683ee 100644 --- a/ch3/ch3-06.md +++ b/ch3/ch3-06.md @@ -39,7 +39,7 @@ func parseIPv4(s string) IP { const noDelay time.Duration = 0 const timeout = 5 * time.Minute fmt.Printf("%T %[1]v\n", noDelay) // "time.Duration 0" -fmt.Printf("%T %[1]v\n", timeout) // "time.Duration 5m0s +fmt.Printf("%T %[1]v\n", timeout) // "time.Duration 5m0s" fmt.Printf("%T %[1]v\n", time.Minute) // "time.Duration 1m0s" ``` diff --git a/ch5/ch5-05.md b/ch5/ch5-05.md index de5eca3..e78b9de 100644 --- a/ch5/ch5-05.md +++ b/ch5/ch5-05.md @@ -14,7 +14,7 @@ fmt.Println(f(3)) // "-3" fmt.Printf("%T\n", f) // "func(int) int" - f = product // 編譯錯誤: can't assign f(int, int) int to f(int) int + f = product // compile error: can't assign func(int, int) int to func(int) int ``` 函數類型的零值是nil。調用值爲nil的函數值會引起panic錯誤: