1. 程式人生 > >Go語言中的make和new

Go語言中的make和new

內存 sharp 補充 UNC 地址 賦值 fmt signal bubuko

相同點:

make和new都是用來創建分配類型內存的。

不同點:

先看下面的代碼

package main
import "fmt"
func main(){ var i *int var x = 10 *i=x fmt.Println(*i) }   

編譯過程會出錯

panic: runtime error: invalid memory address or nil pointer dereference 
[signal 0xc0000005 code=0x1 addr=0x0 pc=0x48b576]

我們的想法是把 10 賦值 i指向的地址,但是這裏由於 *i 沒有初始化,所以並不知道 *i的地址是什麽,如果直接 *i的賦值為10,那麽肯定是不行的(10這個地址沒有)

所以要想使用 *i,需要把 x的地址給i,修改成如下代碼

var i *int 
var x = 10 
i=&x 
fmt.Println(*i) 

補充: * 代表取地址裏內容, &代表取地址

或者使用 new 進行初始化,代碼如下:

var x = 10 
var i *int i = new(int) 
*i=x 
fmt.Println(*i) 

new的源代碼如下

它只接受一個參數,這個參數是一個類型,分配好內存後,返回一個指向該類型內存地址的指針。同時請註意它同時把分配的內存置為零,也就是類型的零值。

技術分享圖片

make也是用於內存分配的,但是和new不同,它只用於chan、map以及slice的內存創建,

而且它返回的類型就是這三個類型本身,而不是他們的指針類型,因為這三種類型就是引用類型,所以就沒有必要返回他們的指針了。

綜上:

二者都是內存的分配(堆上)

區別1

make只用於slice、map以及channel的初始化(非零值);

new用於類型的內存分配,並且內存置為零。

區別2

make返回的還是這三個引用類型本身;

new返回的是指向類型的指針。

Go語言中的make和new