Go make 和 new的區別

2022-05-08 23:27:12 字數 2624 閱讀 9523

在go語言中:

make 被用來分配引用型別的記憶體: map, slice, channel

new 被用來分配除了引用型別的所有其他型別的記憶體: int, string, array等

本文主要給大家介紹了go語言中函式new與make的使用和區別,關於go語言中new和make是內建的兩個函式,主要用來建立分配型別記憶體。在我們定義生成變數的時候,可能會覺得有點迷惑,其實他們的規則很簡單,下面我們就通過一些示例說明他們的區別和使用,話不多說了,來一起看看詳細的介紹吧。

變數的宣告?1

2vari int

vars string

變數的宣告我們可以通過var關鍵字,然後就可以在程式中使用。當我們不指定變數的預設值時,這些變數的預設值是他們的零值,比如int型別的零值是0,string型別的零值是"",引用型別的零值是nil。

對於例子中的兩種型別的宣告,我們可以直接使用,對其進行賦值輸出。但是如果我們換成引用型別呢??1

2345

6789

package main

import (

"fmt"

)

func main()

這個例子會列印出什麼?0還是10?。以上全錯,執行的時候會painc,原因如下:?1

panic: runtime error: invalid memory address or nil pointer dereference

從這個提示中可以看出,對於引用型別的變數,我們不光要宣告它,還要為它分配內容空間,否則我們的值放在**去呢?這就是上面錯誤提示的原因。

對於值型別的宣告不需要,是因為已經預設幫我們分配好了。

要分配記憶體,就引出來今天的new和make。

new

對於上面的問題我們如何解決呢?既然我們知道了沒有為其分配記憶體,那麼我們使用new分配乙個吧。?1

2345

6func main()

現在再執行程式,完美pass,列印10。現在讓我們看下new這個內建的函式。?1

234// 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.

funcnew(type) *type

它只接受乙個引數,這個引數是乙個型別,分配好記憶體後,返回乙個指向該型別記憶體位址的指標。同時請注意它同時把分配的記憶體置為零,也就是型別的零值。

我們的例子中,如果沒有*i=10,那麼列印的就是0。這裡體現不出來new函式這種記憶體置為零的好處,我們再看乙個例子。?1

2345

6789

1011

12func main()

type user struct

示例中的user型別中的lock欄位我不用初始化,直接可以拿來用,不會有無效記憶體引用異常,因為它已經被零值了。

這就是new,它返回的永遠是型別的指標,指向分配型別的記憶體位址。

make

make也是用於記憶體分配的,但是和new不同,它只用於chan、map以及切片的記憶體建立,而且它返回的型別就是這三個型別本身,而不是他們的指標型別,因為這三種型別就是引用型別,所以就沒有必要返回他們的指標了。

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

func make(t type, size ...integertype) type

從函式宣告中可以看到,返回的還是該型別。

二者異同

所以從這裡可以看的很明白了,二者都是記憶體的分配(堆上),但是make只用於slice、map以及channel的初始化(非零值);而new用於型別的記憶體分配,並且記憶體置為零。所以在我們編寫程式的時候,就可以根據自己的需要很好的選擇了。

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

其實new不常用

所以有new這個內建函式,可以給我們分配一塊記憶體讓我們使用,但是現實的編碼中,它是不常用的。我們通常都是採用短語句宣告以及結構體的字面量達到我們的目的,比如:?1

2i:=0

u:=user{}

這樣更簡潔方便,而且不會涉及到指標這種比麻煩的操作。

make函式是無可替代的,我們在使用slice、map以及channel的時候,還是要使用make進行初始化,然後才才可以對他們進行操作。

go make 和 new 的區別

new 和 make 都可以用來分配空間,初始化型別,但是它們確有不同。new t 為乙個 t 型別新值分配空間並將此空間初始化為 t 的零值,返回的是新值的位址,也就是 t 型別的指標 t,該指標指向 t 的新分配的零值。p1 new int fmt.printf p1 v n p1 int 0x...

Go make 和 new 的區別

在 go 中對某種型別進行初始化時會用到make和new,因為它們的功能相似,所以初學者可能對它們的感到困惑 本文將由淺入深的介紹其功能和區別 長話短說,先放上結論 方法作用 作用物件 返回值new 分配記憶體 值型別和使用者定義的型別 初始化為零值,返回指標 make 分配記憶體 內建引用型別 m...

new和malloc的區別

1 new 是c 中的操作符,malloc是c 中的乙個函式 2 new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的析構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫析構函式 3 記憶體洩漏對於malloc或者new都可以檢查出來的,...