1. 程式人生 > >Golang new和 make的區別

Golang new和 make的區別

Golang new和 make的區別

 

Go提供了兩種分配原語,即new和make。它們所做的事情是不一樣的,所應用的型別也不同。

new用來分配記憶體,但與其他語言中的同名函式不同,它不會初始化記憶體,只會講記憶體置零;也就是說,new(T)會為型別為T的新項分配已置零的記憶體空間,並返回他的地址,也就是一個型別為*T的值。用Go的術語來說,它返回一個指標,改指標指向新分配的,型別為T的零值;

make的目的不同於new,它只用於slice,map,channel的建立,並返回型別為T(非指標)的已初始化(非零值)的值;出現這種差異的原因在於,這三種類型本質上為引用型別,它們在使用前必須初始化;

小結:
new和make都在堆上分配記憶體,但是它們的行為不同,適用於不同的型別。

new(T) 為每個新的型別T分配一片記憶體,初始化為 0 並且返回型別為*T的記憶體地址:這種方法 返回一個指向型別為 T,值為 0 的地址的指標,它適用於值型別如陣列和結構體;它相當於 &T{}。

make(T) 返回一個型別為 T 的初始值,它只適用於3種內建的引用型別:slice、map 和 channel。

換言之,new 函式分配記憶體,make 函式初始化;下圖給出了區別:

 

</br>

通過實驗,可以更直觀的檢視兩者之間的區別

package main

import "fmt"

func main() {
    p := new([]int) //p == nil; with len and cap 0
    fmt.Println(p)

    v := make([]int, 10, 50) // v is initialed with len 10, cap 50
    fmt.Println(v)

    /*********Output****************
        &[]
        [0 0 0 0 0 0 0 0 0 0]
    *********************************/

    (*p)[0] = 18        // panic: runtime error: index out of range
                        // because p is a nil pointer, with len and cap 0
    v[1] = 18           // ok
    
}