ch2-03,ch2-03-1 review

This commit is contained in:
chai2010 2015-12-26 14:25:43 +08:00
parent ab90c85ce2
commit e793c91fdb
2 changed files with 22 additions and 23 deletions

View File

@ -1,6 +1,6 @@
### 2.3.1. 簡短變量聲明 ### 2.3.1. 簡短變量聲明
在函數內部, 有一種稱爲簡短變量聲明的形式可用於聲明和初始化局部變量. 以 `名字 := 表達式` 方式聲明變量, 變量的類型根據表達式來推導. 這里函數中是三個簡短變量聲明語句(§1.4): 在函數內部,有一種稱爲簡短變量聲明語句的形式可用於聲明和初始化局部變量。它以“名字 := 表達式”形式聲明變量變量的類型根據表達式來自動推導。下面是lissajous函數中的三個簡短變量聲明語句§1.4
```Go ```Go
anim := gif.GIF{LoopCount: nframes} anim := gif.GIF{LoopCount: nframes}
@ -8,32 +8,31 @@ freq := rand.Float64() * 3.0
t := 0.0 t := 0.0
``` ```
因爲簡潔和靈活性, 簡短變量聲明用於大部分的局部變量的聲明和初始化. var 方式的聲明往往是用於需要顯示指定類型的局部變量, 或者因爲稍後會被賦值而初始值無關緊要的變量. 因爲簡潔和靈活的特點簡短變量聲明被廣泛用於大部分的局部變量的聲明和初始化。var形式的聲明語句往往是用於需要顯式指定變量類型地方或者因爲變量稍後會被重新賦值而初始值無關緊要的地方。
```Go ```Go
i := 100 // an int i := 100 // an int
var boiling float64 = 100 // a float64 var boiling float64 = 100 // a float64
var names []string var names []string
var err error var err error
var p Point var p Point
``` ```
於 var 聲明變量一樣, 簡短變量聲明也可以用來聲明和初始化一組變量: 和var形式聲明變語句一樣簡短變量聲明語句也可以用來聲明和初始化一組變量
```Go ```Go
i, j := 0, 1 i, j := 0, 1
``` ```
但是這種聲明多個變量的方式隻簡易在可以提高代碼可讀性的地方使用, 比如 for 循環的初始化部分. 但是這種同時聲明多個變量的方式應該限製在可以提高代碼可讀性的地方使用比如for語句的循環的初始化語句部分。
請記住 `:=` 是一個變量聲明, 而 `=` 是一個賦值操作. 不要混淆多個變量的聲明和元組的多重(§2.4.1), 後者是將右邊的表達式值賦給左邊對應位置的變量: 請記住“:=”是一個變量聲明語句,而“=是一個變量賦值操作。不要混淆多個變量的聲明和元組的多重賦值§2.4.1),後者是將右邊各個的表達式值賦值給左邊對應位置的各個變量:
```Go ```Go
i, j = j, i // 交換 i 和 j 的值 i, j = j, i // 交換 i 和 j 的值
``` ```
和普通 var 變量聲明一樣, 簡短變量聲明也可以用調用函數的返迴值來聲明, 像 os.Open 函數返迴兩個值: 和普通var形式的變量聲明語句一樣簡短變量聲明語句也可以用函數的返迴值來聲明和初始化變量像下面的os.Open函數調用將返迴兩個值
```Go ```Go
f, err := os.Open(name) f, err := os.Open(name)
@ -44,9 +43,9 @@ if err != nil {
f.Close() f.Close()
``` ```
這里有一個比較微妙的地方: 簡短變量聲明左邊的全部變量可能併不是全部都是剛剛聲明的. 如果有一些已經在相同的詞法塊聲明過了(§2.7), 那麽簡短變量聲明對這些已經聲明過的變量就隻有賦值行爲了. 這里有一個比較微妙的地方簡短變量聲明左邊的變量可能併不是全部都是剛剛聲明的。如果有一些已經在相同的詞法域聲明過了§2.7),那麽簡短變量聲明語句對這些已經聲明過的變量就隻有賦值行爲了。
在下面的代碼中, 第一個語句聲明了 in 和 err 變量. 第二個語句隻聲明了 out, 然後對已經聲明的 err 進行賦值. 在下面的代碼中第一個語句聲明了in和err兩個變量。在第二個語句隻聲明了out一個變量然後對已經聲明的err進行了賦值操作。
```Go ```Go
in, err := os.Open(infile) in, err := os.Open(infile)
@ -54,7 +53,7 @@ in, err := os.Open(infile)
out, err := os.Create(outfile) out, err := os.Create(outfile)
``` ```
簡短變量聲明必鬚至少聲明一個新的變量, 否則編譯將不能通過: 簡短變量聲明語句中必鬚至少要聲明一個新的變量,下面的代碼將不能編譯通過:
```Go ```Go
f, err := os.Open(infile) f, err := os.Open(infile)
@ -62,8 +61,9 @@ f, err := os.Open(infile)
f, err := os.Create(outfile) // compile error: no new variables f, err := os.Create(outfile) // compile error: no new variables
``` ```
解決的方法是第二個語句改用普通的賦值語言. 解決的方法是第二個簡短變量聲明語句改用普通的多重賦值語言。
簡短變量聲明語句隻有對已經在同級詞法域聲明過的變量纔和賦值操作語句等價,如果變量是在外部詞法域聲明的,那麽簡短變量聲明語句將會在當前詞法域重新聲明一個新的變量。我們在本章後面將會看到類似的例子。
簡短變量聲明隻有對在變量已經在同級詞法域聲明過的變量纔和賦值操作等同, 如果變量是在外部詞法域聲明了, 那麽將會聲明一個新變量. 我們在本章後面將會看到類似的例子.

View File

@ -1,33 +1,32 @@
## 2.3. 變量 ## 2.3. 變量
var 聲明可以創建一個特定類型的變量, 然後給變量附加一個名字, 併且設置變量的初始值. 變量聲明的一般語法: var聲明語句可以創建一個特定類型的變量,然後給變量附加一個名字,併且設置變量的初始值。變量聲明的一般語法如下:
```Go ```Go
var name type = 表達式 var 變量名字 類型 = 表達式
``` ```
其中類型或 `= 表達式` 可以省略其中的一個. 如果省略的是類型信息, 那麽將根據初始化表達式類推導類型信息. 如果初始化表達式被省略, 那麽將用零值初始化變量. 數值類型變量的零值是0, 布爾類型變量的零值是 false, 字符串的零值是空字符串, 接口或引用類型(包括 切片, 字典, 通道 和 函數)的變量的零值是 nil. 數組或結構體等聚合類型的零值是每個元素或字段都是零值. 其中“*類型*”或“*= 表達式*”兩個部分可以省略其中的一個。如果省略的是類型信息,那麽將根據初始化表達式來推導變量的類型信息。如果初始化表達式被省略,那麽將用零值初始化該變量。 數值類型變量對應的零值是0布爾類型變量對應的零值是false字符串類型對應的零值是空字符串接口或引用類型包括slice、map、chan和函數變量對應的零值是nil。數組或結構體等聚合類型對應的零值是每個元素或字段都是對應該類型的零值。
零值機製可以確保每個聲明的變量總是有一個良好定義的值, 在 Go 中不存在未初始化的變量. 這個可以簡化很多代碼, 在沒有增加額外工作的前提下確保邊界條件下的合理行爲. 例如: 零值初始化機製可以確保每個聲明的變量總是有一個良好定義的值因此在Go語言中不存在未初始化的變量。這個特性可以簡化很多代碼而且可以在沒有增加額外工作的前提下確保邊界條件下的合理行爲。例如
```Go ```Go
var s string var s string
fmt.Println(s) // "" fmt.Println(s) // ""
``` ```
這段代碼將打印一個空字符串, 而不是導致錯誤或産生不可預知的行爲. Go 程序員經常讓一些聚合類型的零值也有意義, 這樣不管任何類型的變量總是有一個合理的零值狀態. 這段代碼將打印一個空字符串而不是導致錯誤或産生不可預知的行爲。Go語言程序員應該讓一些聚合類型的零值也具有意義這樣可以保證不管任何類型的變量總是有一個合理有效的零值狀態。
可以在一個聲明語句中同時聲明一組變量, 或用一組初始化表達式聲明併初始化一組變量. 也可以在一個聲明語句中同時聲明一組變量,或用一組初始化表達式聲明併初始化一組變量。如果省略每個變量的類型,將可以聲明多個類型不同的變量(類型由初始化表達式推導):
如果省略每個變量的類型, 將可以聲明多個不同類型的變量(類型由初始化表達式推導):
```Go ```Go
var i, j, k int // int, int, int var i, j, k int // int, int, int
var b, f, s = true, 2.3, "four" // bool, float64, string var b, f, s = true, 2.3, "four" // bool, float64, string
``` ```
初始化可以是字面量或任意的表達式. 包級别聲明的變量會在 main 函數執行前完成初始化 (§2.6.2), 局部變量將在聲明語句被執行到的時候初始化. 初始化表達式可以是字面量或任意的表達式。在包級别聲明的變量會在main入口函數執行前完成初始化§2.6.2),局部變量將在聲明語句被執行到的時候完成初始化。
一組變量的初始化也可以通過調用一個函數, 由函數返迴的多個返迴值初始化: 一組變量也可以通過調用一個函數,由函數返迴的多個返迴值初始化:
```Go ```Go
var f, err = os.Open(name) // os.Open returns a file and an error var f, err = os.Open(name) // os.Open returns a file and an error