mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-10-23 15:01:48 +00:00
ch2-03 review
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
### 2.3.3 new 函數
|
||||
### 2.3.3. new函數
|
||||
|
||||
|
||||
另一個創建變量的方法是用內建的 new 函數. 表達式 `new(T)` 創建一個T類型的匿名變量, 初始化爲T類型的零值, 返迴返迴變量地址, 返迴指針類型爲 `*T`.
|
||||
另一個創建變量的方法是調用用內建的new函數。表達式new(T)將創建一個T類型的匿名變量,初始化爲T類型的零值,然後返迴變量地址,返迴的指針類型爲`*T`。
|
||||
|
||||
```Go
|
||||
p := new(int) // p, *int 類型, 指向匿名的 int 變量
|
||||
@@ -10,10 +9,9 @@ fmt.Println(*p) // "0"
|
||||
fmt.Println(*p) // "2"
|
||||
```
|
||||
|
||||
用new創建變量和普通變量聲明語句方式創建變量沒有什麽區别,除了不需要聲明一個臨時變量的名字外,我們還可以在表達式中使用new(T)。換言之,new函數類似是一種語法醣,而不是一個新的基礎概念。
|
||||
|
||||
從 new 創建變量和普通聲明方式創建變量沒有什麽區别, 除了不需要聲明一個臨時變量的名字外, 我們還可以在表達式中使用 `new(T)`. 換言之, new 類似是一種語法醣, 而不是一個新的基礎概念.
|
||||
|
||||
下面的兩個 newInt 函數有着相同的行爲:
|
||||
下面的兩個newInt函數有着相同的行爲:
|
||||
|
||||
```Go
|
||||
func newInt() *int { func newInt() *int {
|
||||
@@ -22,7 +20,7 @@ func newInt() *int { func newInt() *int {
|
||||
}
|
||||
```
|
||||
|
||||
每次調用 new 都是返迴一個新的變量的地址, 因此下面兩個地址是不同的:
|
||||
每次調用new函數都是返迴一個新的變量的地址,因此下面兩個地址是不同的:
|
||||
|
||||
```Go
|
||||
p := new(int)
|
||||
@@ -30,15 +28,15 @@ q := new(int)
|
||||
fmt.Println(p == q) // "false"
|
||||
```
|
||||
|
||||
當然也有特殊情況: 如果兩個類型都是空的, 也就是説類型的大小是0, 例如 `struct{}` 和 `[0]int`, 有可能有相同的地址(依賴具體的語言實現).
|
||||
當然也可能有特殊情況:如果兩個類型都是空的,也就是説類型的大小是0,例如`struct{}`和 `[0]int`, 有可能有相同的地址(依賴具體的語言實現)(譯註:請謹慎使用大小爲0的類型,因爲如果類型的大小位0好話,可能導致Go語言的自動垃圾迴收器有不同的行爲,具體請査看`runtime.SetFinalizer`函數相關文檔)。
|
||||
|
||||
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函數的。
|
||||
|
||||
|
Reference in New Issue
Block a user