Go語言中make和new函數的用法與區別
相同點:
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 <br data-filtered="filtered">[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返回的是指向類型的指針。
以上就是這篇文章的全部內容瞭,希望本文的內容對大傢的學習或者工作具有一定的參考學習價值,謝謝大傢對WalkonNet的支持。如果你想瞭解更多相關內容請查看下面相關鏈接
推薦閱讀:
- 徹底理解golang中什麼是nil
- Go 修改map slice array元素值操作
- Go 語言選擇器實例教程
- Golang語言如何避免空指針引發的panic詳解
- Go select使用與底層原理講解