This commit is contained in:
chai2010
2015-12-21 12:55:18 +08:00
parent 1d7534e3c3
commit 7ec2f7cdc1
152 changed files with 54426 additions and 8958 deletions

View File

@@ -1,19 +1,19 @@
### 2.3.3 new 函數
另一個創建變量的方法是用內建的 new 函數. 達式 `new(T)` 創建一個T類型的匿名變量, 初始化T類型的零值, 返迴返迴變量地址, 返迴指類型 `*T`.
另一個創建變量的方法是用內建的 new 函數. 達式 `new(T)` 創建一個T類型的匿名變量, 初始化T類型的零值, 返迴返迴變量地址, 返迴指類型 `*T`.
```Go
p := new(int) // p, *int 類型, 指匿名的 int 變量
p := new(int) // p, *int 類型, 指匿名的 int 變量
fmt.Println(*p) // "0"
*p = 2 // 設置 int 匿名變量的值 2
*p = 2 // 設置 int 匿名變量的值 2
fmt.Println(*p) // "2"
```
從 new 創建變量和普通聲明方式創建變量沒有什麼區彆, 除了不需要聲明一個臨時變量的名字外, 我們還可以在達式中使用 `new(T)`. 換言之, new 類似是一種語法醣, 而不是一個新的基礎概.
從 new 創建變量和普通聲明方式創建變量沒有什麽區别, 除了不需要聲明一個臨時變量的名字外, 我們還可以在達式中使用 `new(T)`. 換言之, new 類似是一種語法醣, 而不是一個新的基礎概.
的兩個 newInt 函數有着相的行:
的兩個 newInt 函數有着相的行:
```Go
func newInt() *int { func newInt() *int {
@@ -22,7 +22,7 @@ func newInt() *int { func newInt() *int {
}
```
每次調用 new 都是返迴一個新的變量的地址, 因此下兩個地址是不的:
每次調用 new 都是返迴一個新的變量的地址, 因此下兩個地址是不的:
```Go
p := new(int)
@@ -30,15 +30,15 @@ q := new(int)
fmt.Println(p == q) // "false"
```
當然也有特殊情況: 如果兩個類型都是空的, 也就是類型的大小是0, 例如 `struct{}``[0]int`, 有可能有相的地址(依賴具體的語言實現).
當然也有特殊情況: 如果兩個類型都是空的, 也就是類型的大小是0, 例如 `struct{}``[0]int`, 有可能有相的地址(依賴具體的語言實現).
new 函數使用相對比較少, 因對應結構體來, 可以直接用字量語法創建新變量的方法更靈活 (§4.4.1).
new 函數使用相對比較少, 因對應結構體來, 可以直接用字量語法創建新變量的方法更靈活 (§4.4.1).
由於 new 隻是一個預定義的函數, 它併不是一個關鍵字, 因此我們可以將 new 重新定義為彆的類型. 例如:
由於 new 隻是一個預定義的函數, 它併不是一個關鍵字, 因此我們可以將 new 重新定義爲别的類型. 例如:
```Go
func delta(old, new int) int { return new - old }
```
new 被定義 int 類型的變量, 因此 delta 函數內部就無法在使用內置的 new 函數了.
new 被定義 int 類型的變量, 因此 delta 函數內部就無法在使用內置的 new 函數了.