golang中make和new的區別

話不多說先上代碼

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
    
}

new

// The new built-in function allocates memory. The first argument is a type,

// not a value, and the value returned is a pointer to a newly

// allocated zero value of that type.

func new(Type) *Type

       new函數它返回的永遠是類型的指針,指向分配類型的內存地址。同時請注意它同時把分配的內存置爲零,也就是類型的零值。

make

      make也是用於內存分配的,但是和new不同,它只用於chan、map以及slice的內存創建,而且它返回的類型就是這三個類型本身,而不是他們的指針類型,因爲這三種類型就是引用類型,所以就沒有必要返回他們的指針了。

注意,因爲這三種類型是引用類型,所以必須得初始化,但是不是置爲零值,這個和new是不一樣的。

func make(t Type, size ...IntegerType) Type

二者異同

從函數聲明中可以看到,返回的還是該類型。所以從這裏可以看的很明白了,二者都是內存的分配(堆上),但是make只用於slice、map以及channel的初始化(非零值);而new用於類型的內存分配,並且內存置爲零。所以在我們編寫程序的時候,就可以根據自己的需要很好的選擇了。

make返回的還是這三個引用類型本身;而new返回的是指向類型的指針。

其實new不常用

所以有new這個內置函數,可以給我們分配一塊內存讓我們使用,但是現實的編碼中,它是不常用的。我們通常都是採用短語句聲明以及結構體的字面量達到我們的目的。make函數是無可替代的,我們在使用slice、map以及channel的時候,還是要使用make進行初始化,然後才纔可以對他們進行操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章