mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2024-12-25 14:28:58 +00:00
ch3: fix code path
This commit is contained in:
parent
7fe7a309be
commit
ca0f87fad9
@ -75,9 +75,8 @@ func compute() (value float64, ok bool) {
|
||||
|
||||
![](../images/ch3-01.png)
|
||||
|
||||
|
||||
<u><i>gopl.io/ch3/surface</i></u>
|
||||
```Go
|
||||
gopl.io/ch3/surface
|
||||
// Surface computes an SVG rendering of a 3-D surface function.
|
||||
package main
|
||||
|
||||
@ -161,5 +160,3 @@ w.Header().Set("Content-Type", "image/svg+xml")
|
||||
```
|
||||
|
||||
(這一步在Lissajous例子中不是必須的,因爲服務器使用標準的PNG圖像格式,可以根據前面的512個字節自動輸出對應的頭部。)允許客戶端通過HTTP請求參數設置高度、寬度和顔色等參數。
|
||||
|
||||
|
||||
|
@ -33,9 +33,8 @@ fmt.Println(cmplx.Sqrt(-1)) // "(0+1i)"
|
||||
|
||||
下面的程序使用complex128複數算法來生成一個Mandelbrot圖像。
|
||||
|
||||
<u><i>gopl.io/ch3/mandelbrot</i></u>
|
||||
```Go
|
||||
gopl.io/ch3/mandelbrot
|
||||
|
||||
// Mandelbrot emits a PNG image of the Mandelbrot fractal.
|
||||
package main
|
||||
|
||||
@ -95,6 +94,3 @@ func mandelbrot(z complex128) color.Color {
|
||||
**練習 3.8:** 通過提高精度來生成更多級别的分形。使用四種不同精度類型的數字實現相同的分形:complex64、complex128、big.Float和big.Rat。(後面兩種類型在math/big包聲明。Float是有指定限精度的浮點數;Rat是無效精度的有理數。)它們間的性能和內存使用對比如何?當渲染圖可見時縮放的級别是多少?
|
||||
|
||||
**練習 3.9:** 編寫一個web服務器,用於給客戶端生成分形的圖像。運行客戶端用過HTTP參數參數指定x,y和zoom參數。
|
||||
|
||||
|
||||
|
||||
|
@ -115,7 +115,7 @@ for range s {
|
||||
|
||||
正如我們前面提到的,文本字符串采用UTF8編碼隻是一種慣例,但是對於循環的眞正字符串併不是一個慣例,這是正確的。如果用於循環的字符串隻是一個普通的二進製數據,或者是含有錯誤編碼的UTF8數據,將會發送什麽呢?
|
||||
|
||||
每一個UTF8字符解碼,不管是顯式地調用utf8.DecodeRuneInString解碼或是在range循環中隱式地解碼,如果遇到一個錯誤的UTF8編碼輸入,將生成一個特别的Unicode字符'\uFFFD',在印刷中這個符號通常是一個黑色六角或鑽石形狀,里面包含一個白色的問號(?)。當程序遇到這樣的一個字符,通常是一個危險信號,説明輸入併不是一個完美沒有錯誤的UTF8字符串。
|
||||
每一個UTF8字符解碼,不管是顯式地調用utf8.DecodeRuneInString解碼或是在range循環中隱式地解碼,如果遇到一個錯誤的UTF8編碼輸入,將生成一個特别的Unicode字符'\uFFFD',在印刷中這個符號通常是一個黑色六角或鑽石形狀,里面包含一個白色的問號"<22>"。當程序遇到這樣的一個字符,通常是一個危險信號,説明輸入併不是一個完美沒有錯誤的UTF8字符串。
|
||||
|
||||
UTF8字符串作爲交換格式是非常方便的,但是在程序內部采用rune序列可能更方便,因爲rune大小一致,支持數組索引和方便切割。
|
||||
|
||||
@ -147,10 +147,5 @@ fmt.Println(string(0x4eac)) // "京"
|
||||
如果對應碼點的字符是無效的,則用'\uFFFD'無效字符作爲替換:
|
||||
|
||||
```Go
|
||||
fmt.Println(string(1234567)) // "(?)"
|
||||
fmt.Println(string(1234567)) // "<EFBFBD>"
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -18,8 +18,8 @@ fmt.Println(basename("abc")) // "abc"
|
||||
|
||||
第一個版本併沒有使用任何庫,全部手工硬編碼實現:
|
||||
|
||||
<u><i>gopl.io/ch3/basename1</i></u>
|
||||
```Go
|
||||
gopl.io/ch3/basename1
|
||||
// basename removes directory components and a .suffix.
|
||||
// e.g., a => a, a.go => a, a/b/c.go => c, a/b.c.go => b.c
|
||||
func basename(s string) string {
|
||||
@ -43,9 +43,8 @@ func basename(s string) string {
|
||||
|
||||
簡化個版本使用了strings.LastIndex庫函數:
|
||||
|
||||
<u><i>gopl.io/ch3/basename2</i></u>
|
||||
```Go
|
||||
gopl.io/ch3/basename2
|
||||
|
||||
func basename(s string) string {
|
||||
slash := strings.LastIndex(s, "/") // -1 if "/" not found
|
||||
s = s[slash+1:]
|
||||
@ -60,9 +59,8 @@ path和path/filepath包提供了關於文件路徑名更一般的函數操作。
|
||||
|
||||
讓我們繼續另一個字符串的例子。函數的功能是將一個表示整值的字符串,每隔三個字符插入一個逗號分隔符,例如“12345”處理後成爲“12,345”。這個版本隻適用於整數類型;支持浮點數類型的支持留作練習。
|
||||
|
||||
<u><i>gopl.io/ch3/comma</i></u>
|
||||
```Go
|
||||
gopl.io/ch3/comma
|
||||
|
||||
// comma inserts commas in a non-negative decimal integer string.
|
||||
func comma(s string) string {
|
||||
n := len(s)
|
||||
@ -113,9 +111,8 @@ func Join(s [][]byte, sep []byte) []byte
|
||||
|
||||
bytes包還提供了Buffer類型用於字節slice的緩存。一個Buffer開始是空的,但是隨着string、byte或[]byte等類型數據的寫入可以動態增長,一個bytes.Buffer變量併不需要處理化,因爲零值也是有效的:
|
||||
|
||||
<u><i>gopl.io/ch3/printints</i></u>
|
||||
```Go
|
||||
gopl.io/ch3/printints
|
||||
|
||||
// intsToString is like fmt.Sprint(values) but adds commas.
|
||||
func intsToString(values []int) string {
|
||||
var buf bytes.Buffer
|
||||
@ -144,7 +141,3 @@ bytes.Buffer類型有着很多實用的功能,我們在第七章討論接口
|
||||
**練習 3.11:** 完善comma函數,以支持浮點數處理和一個可選的正負號的處理。
|
||||
|
||||
**練習 3.12:** 編寫一個函數,判斷兩個字符串是否是是相互打亂的,也就是説它們有着相同的字符,但是對應不同的順序。
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -36,9 +36,8 @@ const (
|
||||
|
||||
隨着iota的遞增,每個常量對應表達式1 << iota,是連續的2的冪,分别對應一個bit位置。使用這些常量可以用於測試、設置或清除對應的bit位的值:
|
||||
|
||||
<u><i>gopl.io/ch3/netflag</i></u>
|
||||
```Go
|
||||
gopl.io/ch3/netflag
|
||||
|
||||
func IsUp(v Flags) bool { return v&FlagUp == FlagUp }
|
||||
func TurnDown(v *Flags) { *v &^= FlagUp }
|
||||
func SetBroadcast(v *Flags) { *v |= FlagBroadcast }
|
||||
@ -74,5 +73,3 @@ const (
|
||||
不過iota常量生成規則也有其局限性。例如,它併不能用於産生1000的冪(KB、MB等),因爲Go語言併沒有計算冪的運算符。
|
||||
|
||||
**練習 3.13:** 編寫KB、MB的常量聲明,然後擴展到YB。
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user