golang的new和make

new和make

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

要分配內存,就引出來今天的newmake指針

new(new(T) 返回的是 T 的指針)

//new 聲明
 i :=new(int)
 r := new(map[string]int)
 println(r)//0xc000072e70

 /* 如今再運行程序,完美PASS,打印10。如今讓咱們看下new這個內置的函數。 func new(Type) *Type */
 //它只接受一個參數,這個參數是一個類型,分配好內存後,返回一個指向該類型內存地址的指針。
 //同時請注意它同時把分配的內存置爲零,也就是類型的零值。
複製代碼

make(make 只能用於 slice,map,channel)

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

  • 注意slice map channel這三個是引用類型
  • make(T, args) 返回的值經過函數傳遞參數以後能夠直接修改,即 map,slice,channel 經過函數穿參以後在函數內部修改將影響函數外部的值。
/* 從函數聲明中能夠看到,返回的仍是該類型。 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不經常使用

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

i:=0
複製代碼

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

相關文章
相關標籤/搜索