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

2022-10-04 08:26:48 字數 6087 閱讀 9424

1樓:老男孩教育

·new:是一個用來分配記憶體的內建函式,與c++不同的是,它不初始化記憶體,只是將其歸零,也就相當於,new(x)會為x的新專案分配被歸零的儲存,且返回它的地址,其中,第一個引數是型別,返回值是型別的指標,其值被初始化為『0』,對於不同的資料型別,0值的意義也是不一樣的,比如int初始化為0,bool初始化為false等等。

·make:是golang的內建函式,僅用於分配和初始化slice、map及channel型別的物件,三種型別都是結構,返回值為型別而不是指標,例如slice是一個三元描述符,包含一個指向資料(在陣列中)的指標,長度以及容量,在這些項被初始化前,slice都是nil的,對於這三者,make初始化這些內部資料結構,並準備好可用的值。

需要注意的是,make只用於map、slice和channel,並且不反悔指標,想要獲得一個顯式的指標,使用new進行分配,或者顯式地使用一個變數的地址。

2樓:森林之黃

new 主要用於結構體的初始化

make用於陣列array,切片slice,協程chnnel的初始化

例如: users:=make([10]int);

msg:=make(chan int);

new會分配結構空間,並初始化為清空為零,不進一步初始化

new之後需要一個指標來指向這個結構

make會分配結構空間及其附屬空間,並完成其間的指標初始化

make返回這個結構空間,不另外分配一個指標

例子new:

var p *int = new(int)

或p := new(int)

以上分配了一個slice結構,但是結構中的應該指向底層陣列的ptr指標為空,故實際不能往這個slice裡面存取資料

同時分配了一個指標p,也即(在32位系統中)佔4個位元組並存放slice結構的地址

例子make:

var v int = make(int, 0)

v := make(int, 0)

以上分配了一個slice結構,且結構中的應該指向底層陣列的ptr指標已經指向了某個底層陣列,這個底層陣列應該已經分配了,故這個slice已經可以使用了

注意v就是這個slice結構,而不是一個指向slice的指標

上述僅是示例,一般使用時都會明確長度和容量:v := make(int, 10, 50)

結論:由上可見,用new來分配slice的意義不大,因為沒有恰當的初始化,無法直接使用

有附帶空間的結構,使用make來初始化,可以完成內部指標初始化,其後可以立即使用

go中的make和new的區別

3樓:匿名使用者

new 主要用於結構體的初始化

make用於陣列array,切片slice,協程chnnel的初始化

例如: users:=make([10]int);

msg:=make(chan int);

new會分配結構空間,並初始化為清空為零,不進一步初始化

new之後需要一個指標來指向這個結構

make會分配結構空間及其附屬空間,並完成其間的指標初始化

make返回這個結構空間,不另外分配一個指標

例子new:

var p *int = new(int)

或p := new(int)

以上分配了一個slice結構,但是結構中的應該指向底層陣列的ptr指標為空,故實際不能往這個slice裡面存取資料

同時分配了一個指標p,也即(在32位系統中)佔4個位元組並存放slice結構的地址

例子make:

var v int = make(int, 0)

v := make(int, 0)

以上分配了一個slice結構,且結構中的應該指向底層陣列的ptr指標已經指向了某個底層陣列,這個底層陣列應該已經分配了,故這個slice已經可以使用了

注意v就是這個slice結構,而不是一個指向slice的指標

上述僅是示例,一般使用時都會明確長度和容量:v := make(int, 10, 50)

結論:由上可見,用new來分配slice的意義不大,因為沒有恰當的初始化,無法直接使用

有附帶空間的結構,使用make來初始化,可以完成內部指標初始化,其後可以立即使用

希望對你有幫助~

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

4樓:匿名使用者

make用於內建型別(map、slice 和channel)的記憶體分配。new用於各種型別的記憶體分配。

內建函式new本質上說跟其它語言中的同名函式功能一樣:new(t)分配了零值填充的t型別的記憶體空間,並且返回其地址,即一個*t型別的值。用go的術語說,它返回了一個指標,指向新分配的型別t的零值。

有一點非常重要:new返回指標。

內建函式make(t, args)與new(t)有著不同的功能,make只能建立slice、map和channel,並且返回一個有初始值(非零)的t型別,而不是*t。

本質來講,導致這三個型別有所不同的原因是指向資料結構的引用在使用前必須被初始化。例如,一個slice,是一個包含指向資料(內部array)的指標、長度和容量的三項描述符;在這些專案被初始化之前,slice為nil。對於slice、map和channel來說,make初始化了內部的資料結構,填充適當的值。

make返回初始化後的(非零)值。

make 是 引用型別 初始化的方法。

golang中new和make的區別

5樓:校椹風雲

new會分配結構空間,並初始化為清空為零,不進一步初始化

new之後需要一個指標來指向這個結構

make會分配結構空間及其附屬空間,並完成其間的指標初始化

make返回這個結構空間,不另外分配一個指標

例子new:

var p *int = new(int)

或p := new(int)

以上分配了一個slice結構,但是結構中的應該指向底層陣列的ptr指標為空,故實際不能往這個slice裡面存取資料

同時分配了一個指標p,也即(在32位系統中)佔4個位元組並存放slice結構的地址

例子make:

var v int = make(int, 0)

v := make(int, 0)

以上分配了一個slice結構,且結構中的應該指向底層陣列的ptr指標已經指向了某個底層陣列,這個底層陣列應該已經分配了,故這個slice已經可以使用了

注意v就是這個slice結構,而不是一個指向slice的指標

上述僅是示例,一般使用時都會明確長度和容量:v := make(int, 10, 50)

結論:由上可見,用new來分配slice的意義不大,因為沒有恰當的初始化,無法直接使用

6樓:老男孩教育

new是內建函式,作用是初始化一個指向型別的指標,make的作用是slice,map或chan初始化並返回引用,第一個引數是一個型別,第二個引數是長度。

go make和make的區別

7樓:森林之黃

new 主要用於結構體的初始化

make用於陣列array,切片slice,協程chnnel的初始化

例如: users:=make([10]int);

msg:=make(chan int);

new會分配結構空間,並初始化為清空為零,不進一步初始化

new之後需要一個指標來指向這個結構

make會分配結構空間及其附屬空間,並完成其間的指標初始化

make返回這個結構空間,不另外分配一個指標

例子new:

var p *int = new(int)

或p := new(int)

以上分配了一個slice結構,但是結構中的應該指向底層陣列的ptr指標為空,故實際不能往這個slice裡面存取資料

同時分配了一個指標p,也即(在32位系統中)佔4個位元組並存放slice結構的地址

例子make:

var v int = make(int, 0)

v := make(int, 0)

以上分配了一個slice結構,且結構中的應該指向底層陣列的ptr指標已經指向了某個底層陣列,這個底層陣列應該已經分配了,故這個slice已經可以使用了

注意v就是這個slice結構,而不是一個指向slice的指標

上述僅是示例,一般使用時都會明確長度和容量:v := make(int, 10, 50)

結論:由上可見,用new來分配slice的意義不大,因為沒有恰當的初始化,無法直接使用

有附帶空間的結構,使用make來初始化,可以完成內部指標初始化,其後可以立即使用

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

8樓:匿名使用者

new 主要用於結構體的初始化

make用於陣列array,切片slice,協程chnnel的初始化

例如: users:=make([10]int);

msg:=make(chan int);

new會分配結構空間,並初始化為清空為零,不進一步初始化

new之後需要一個指標來指向這個結構

make會分配結構空間及其附屬空間,並完成其間的指標初始化

make返回這個結構空間,不另外分配一個指標

例子new:

var p *int = new(int)

或p := new(int)

以上分配了一個slice結構,但是結構中的應該指向底層陣列的ptr指標為空,故實際不能往這個slice裡面存取資料

同時分配了一個指標p,也即(在32位系統中)佔4個位元組並存放slice結構的地址

例子make:

var v int = make(int, 0)

v := make(int, 0)

以上分配了一個slice結構,且結構中的應該指向底層陣列的ptr指標已經指向了某個底層陣列,這個底層陣列應該已經分配了,故這個slice已經可以使用了

注意v就是這個slice結構,而不是一個指向slice的指標

上述僅是示例,一般使用時都會明確長度和容量:v := make(int, 10, 50)

結論:由上可見,用new來分配slice的意義不大,因為沒有恰當的初始化,無法直接使用

有附帶空間的結構,使用make來初始化,可以完成內部指標初始化,其後可以立即使用

go中的make和new的區別

9樓:森林之黃

new 主要用於結構體的初始化

make用於陣列array,切片slice,協程chnnel的初始化

例如: users:=make([10]int);

msg:=make(chan int);

new會分配結構空間,並初始化為清空為零,不進一步初始化

new之後需要一個指標來指向這個結構

make會分配結構空間及其附屬空間,並完成其間的指標初始化

make返回這個結構空間,不另外分配一個指標

例子new:

var p *int = new(int)

或p := new(int)

以上分配了一個slice結構,但是結構中的應該指向底層陣列的ptr指標為空,故實際不能往這個slice裡面存取資料

同時分配了一個指標p,也即(在32位系統中)佔4個位元組並存放slice結構的地址

例子make:

var v int = make(int, 0)

v := make(int, 0)

以上分配了一個slice結構,且結構中的應該指向底層陣列的ptr指標已經指向了某個底層陣列,這個底層陣列應該已經分配了,故這個slice已經可以使用了

注意v就是這個slice結構,而不是一個指向slice的指標

上述僅是示例,一般使用時都會明確長度和容量:v := make(int, 10, 50)

結論:由上可見,用new來分配slice的意義不大,因為沒有恰當的初始化,無法直接使用

有附帶空間的結構,使用make來初始化,可以完成內部指標初始化,其後可以立即使用

關於new和delete的問題,關於new 和 delete 的一個問題??

new的本質是從記憶體的heap區尋找一片空閒的空間然後初始化然後返回。而delete就是把new出來的空間 但是delete怎麼知道該 多少空間呢?顯然,只能是在new的時候提供。因此,a new int 100 的時候,返回到a裡面的最少有兩個資訊 開闢出來的記憶體空間的地址和空間的大小。當b ...

go和goes的區別,goes是什麼意思

go和goes的區別和用法如下 go是動詞原形,一般用於to或者情態動詞後。當主語是第一人稱,第二人稱 和人稱複數 名詞複數時 用 go。如果是一般現在時,並且主語是第。一 第二人稱單數或者複數以及第三人稱複數,也要使用go。goes是go的第三人稱單數形式。當主語是第三人稱單數 或是名詞單數時 謂...

在C 中怎麼通過New申請多個連續的儲存空間

其實原理是一樣的,bai你需要用dunew申請一個空間,zhi 當然了也需要一 dao個指標來承接申內請來的空間。例如 int p p new int 3 申請空間的大容小就是3倍的sizeof int 是連續的。也可以看作是開闢了一個陣列。在c 中也可以單獨開闢一個整型的空間,比如int p ne...