Go語言中new和make是內建的兩個函數,主要用來建立分配類型內存。在咱們定義生成變量的時候,可能會以爲有點迷惑,其實他們的規則很簡單,下面咱們就經過一些示例說明他們的區別和使用。函數
var i int
var s string
複製代碼
變量的聲明咱們能夠經過var關鍵字,而後就能夠在程序中使用。當咱們不指定變量的默認值時,這些變量的默認值是他們的零值,好比int類型的零值是0,string類型的零值是"",引用類型的零值是nil。對於例子中的兩種類型的聲明,咱們能夠直接使用,對其進行賦值輸出。可是若是咱們換成引用類型呢?ui
package main
import (
"fmt"
)
func main() {
var i *int
*i=10
fmt.Println(*i)
}
//這個例子會打印出什麼?0仍是10?。以上全錯,運行的時候會painc,緣由以下
//anic: runtime error: invalid memory address or nil pointer dereference
複製代碼
從這個提示中能夠看出,對於引用類型的變量,咱們不光要聲明它,還要爲它分配內容空間,不然咱們的值放在哪裏去呢?這就是上面錯誤提示的緣由。編碼
對於值類型的聲明不須要,是由於已經默認幫咱們分配好了。spa
要分配內存,就引出來今天的new和make。指針
//new 聲明
i :=new(int)
r := new(map[string]int)
println(r)//0xc000072e70
/* 如今再運行程序,完美PASS,打印10。如今讓咱們看下new這個內置的函數。 func new(Type) *Type */
//它只接受一個參數,這個參數是一個類型,分配好內存後,返回一個指向該類型內存地址的指針。
//同時請注意它同時把分配的內存置爲零,也就是類型的零值。
複製代碼
make也是用於內存分配的,可是和new不一樣,它只用於chan、map以及切片的內存建立,並且它返回的類型就是這三個類型自己,而不是他們的指針類型,由於這三種類型就是引用類型,因此就沒有必要返回他們的指針了。注意,由於這三種類型是引用類型,因此必須得初始化,可是,不是置爲零值,這個和new是不同的。code
/* 從函數聲明中能夠看到,返回的仍是該類型。 func make(t Type, size ...IntegerType) Type */
ages := make(map[string]int)
println(ages)//0xc00007ae88 //引用類型
//map字面值的語法建立map,同時還能夠指定一些最初的key/value:
ages := map[string]int{
"alice": 31,yy
"charlie": 34,
}
複製代碼
因此有new這個內置函數,能夠給咱們分配一塊內存讓咱們使用,可是現實的編碼中,它是不經常使用的。咱們一般都是採用短語句聲明以及結構體的字面量達到咱們的目的,好比:內存
i:=0
複製代碼
make函數是無可替代的,咱們在使用slice、map以及channel的時候,仍是要使用make進行初始化,而後才才能夠對他們進行操做。string