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的支持。如果你想瞭解更多相關內容請查看下面相關鏈接

推薦閱讀: