Go語言中new 和 make 的區別詳解

2021-08-20 08:50:53 字數 1231 閱讀 3160

概述

go 語言中的 new 和 make 一直是新手比較容易混淆的東西,咋一看很相似。不過解釋兩者之間的不同也非常容易。

new 的主要特性

首先 new 是內建函式,你可以從  這兒看到它,它的定義也很簡單:

複製**

**如下:

func new(type) *type

官方文件對於它的描述是:

複製**

**如下:

內建函式 new 用來分配記憶體,它的第乙個引數是乙個型別,不是乙個值,它的返回值是乙個指向新分配型別零值的指標

根據這段描述,我們可以自己實現乙個類似 new 的功能:

複製**

**如下:

func newint() *int

someint := newint()

我們這個函式的功能跟 someint := new(int) 一模一樣。所以在我們自己定義 new 開頭的函式時,出於約定也應該返回型別的指標。

make 的主要特性

make 也是內建函式,你可以從  這兒看到它,它的定義比 new 多了乙個引數,返回值也不同:

複製**

**如下:

func make(type, size integertype) type

官方文件對於它的描述是:

內建函式 make 用來為 slice,map 或 chan 型別分配記憶體和初始化乙個物件(注意:只能用在這三種型別上),跟 new 類似,第乙個引數也是乙個型別而不是乙個值,跟 new 不同的是,make 返回型別的引用而不是指標,而返回值也依賴於具體傳入的型別,具體說明如下:

複製**

**如下:

slice: 第二個引數 size 指定了它的長度,它的容量和長度相同。

你可以傳入第三個引數來指定不同的容量值,但必須不能比長度值小。

比如 make(int, 0, 10)

map: 根據 size 大小來初始化分配記憶體,不過分配後的 map 長度為 0,如果 size 被忽略了,那麼會在初始化分配記憶體時分配乙個小尺寸的記憶體

channel: 管道緩衝區依據緩衝區容量被初始化。如果容量為 0 或者忽略容量,管道是沒有緩衝區的

總結

new 的作用是初始化乙個指向型別的指標(*t),make 的作用是為 slice,map 或 chan 初始化並返回引用(t)。

go語言中new和make區別

new 和 make 是go語言的兩個內建函式,都是用來建立並分配記憶體,new函式只接受乙個引數,這個引數是乙個型別,並且返回乙個指向該型別記憶體位址的指標。而make只能用於 slice map 和 channel 的初始化,它返回的型別就是這三個型別本身,因為這3個本身就是引用型別,就不需要再...

Go語言中函式new與make的使用和區別

大家都知道go語言中的函式new與函式make一直是新手比較容易混淆的東西,看著相似,但其實不同,不過解釋兩者之間的不同也非常容易,下面這篇文章主要給大家介紹了關於go語言中函式new與make區別的相關資料,需要的朋友可以參考下。本文主要給大家介紹了go語言中函式new與make的使用和區別,關於...

go語言中make和new的區別

make用於內建型別 map slice 和channel 的記憶體分配。new用於各種型別的記憶體分配。內建函式new本質上說跟其他語言中的同名函式功能一樣 new t 分配了零值填充的t型別的記憶體空間,並且返回其位址,即乙個 t型別的值。用go語言的術語說,它返回了乙個指標,指向新分配的型別t...