[轉]Go語言中的make和new

前言函數

本文主要給你們介紹了Go語言中函數new與make的使用和區別,關於Go語言中new和make是內建的兩個函數,主要用來建立分配類型內存。在咱們定義生成變量的時候,可能會以爲有點迷惑,其實他們的規則很簡單,下面咱們就經過一些示例說明他們的區別和使用,話很少說了,來一塊兒看看詳細的介紹吧。ui

變量的聲明編碼

var i int
var s string

變量的聲明咱們能夠經過var關鍵字,而後就能夠在程序中使用。當咱們不指定變量的默認值時,這些變量的默認值是他們的零值,好比int類型的零值是0,string類型的零值是"",引用類型的零值是nil。.net

對於例子中的兩種類型的聲明,咱們能夠直接使用,對其進行賦值輸出。可是若是咱們換成引用類型呢?指針

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

這個例子會打印出什麼?0仍是10?。以上全錯,運行的時候會painc,緣由以下:code

panic: runtime error: invalid memory address or nil pointer dereference

從這個提示中能夠看出,對於引用類型的變量,咱們不光要聲明它,還要爲它分配內容空間,不然咱們的值放在哪裏去呢?這就是上面錯誤提示的緣由。htm

對於值類型的聲明不須要,是由於已經默認幫咱們分配好了。內存

要分配內存,就引出來今天的new和make。get

newstring

對於上面的問題咱們如何解決呢?既然咱們知道了沒有爲其分配內存,那麼咱們使用new分配一個吧。

func main() {
 var i *int
 i=new(int)
 *i=10
 fmt.Println(*i)
}

如今再運行程序,完美PASS,打印10。如今讓咱們看下new這個內置的函數。

// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type

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

咱們的例子中,若是沒有*i=10,那麼打印的就是0。這裏體現不出來new函數這種內存置爲零的好處,咱們再看一個例子。

func main() {
 u:=new(user)
 u.lock.Lock()
 u.name = "張三"
 u.lock.Unlock()
 fmt.Println(u)
}
type user struct {
 lock sync.Mutex
 name string
 age int
}

示例中的user類型中的lock字段我不用初始化,直接能夠拿來用,不會有無效內存引用異常,由於它已經被零值了。

這就是new,它返回的永遠是類型的指針,指向分配類型的內存地址。

make

make也是用於內存分配的,可是和new不一樣,它只用於chan、map以及切片的內存建立,並且它返回的類型就是這三個類型自己,而不是他們的指針類型,由於這三種類型就是引用類型,因此就沒有必要返回他們的指針了。

注意,由於這三種類型是引用類型,因此必須得初始化,可是不是置爲零值,這個和new是不同的。

func make(t Type, size ...IntegerType) Type

從函數聲明中能夠看到,返回的仍是該類型。

兩者異同

因此從這裏能夠看的很明白了,兩者都是內存的分配(堆上),可是make只用於slice、map以及channel的初始化(非零值);而new用於類型的內存分配,而且內存置爲零。因此在咱們編寫程序的時候,就能夠根據本身的須要很好的選擇了。

make返回的仍是這三個引用類型自己;而new返回的是指向類型的指針。

其實new不經常使用

因此有new這個內置函數,能夠給咱們分配一塊內存讓咱們使用,可是現實的編碼中,它是不經常使用的。咱們一般都是採用短語句聲明以及結構體的字面量達到咱們的目的,好比:

i:=0
u:=user{}

這樣更簡潔方便,並且不會涉及到指針這種比麻煩的操做。

make函數是無可替代的,咱們在使用slice、map以及channel的時候,仍是要使用make進行初始化,而後才能夠對他們進行操做。

參考

https://www.jb51.net/article/126703.htm

相關文章
相關標籤/搜索