## golang 中有兩個內存分配機制
new 用來初始化一個**對象**,并且返回該對象的首地址.其自身是一個**指針**.可用于初始化**任何類型**
make 返回一個初始化的**實例**,返回的是一個**實例**,而不是**指針**,其只能用來初始化:*slice, map 和 channel* 三種類型
```go
package main
import (
"fmt"
)
func main() {
a := new([]int)
fmt.Println(a) //輸出&[],a本身是一個地址
b := make([]int, 1)
fmt.Println(b) //輸出[0],b本身是一個slice對象,其內容默認為0
}
```
>通過這個例子可以看出,當對slice,map以及channel進行初始化時,使用make比new方式要好,而其他形式的則利用new進行初始化.
## 初始化
使用new進行初始化時只能是默認初始化,無法賦值.很多時候,默認初始化并不是一個好主意,例如一個結構體,默認值的結構體初始化并沒有多大用處,所以面對結構體初始化我們一般適用如下方式:
```
type Rect struct {
x, y float64
width, height float64
}
```
所以我們通過在結構體前面添加取地址符號&對該結構體進行初始化:
```
rect3 := &Rect{0, 0, 100, 200}
rect4 := &Rect{width: 100, height: 200}
```
這種初始化方式在golang中初始化結構體是十分常見的.