一、前言
本文主要給大家介紹了go語言中函式new
與make
的使用和區別,關於go語言中new
和make
是內建的兩個函式,主要用來建立分配型別記憶體。在我們定義生成變數的時候,可能會覺得有點迷惑,其實他們的規則很簡單,下面我們就通過一些示例說明他們的區別和使用。
二、變數的宣告
var i int
var s string
變數的宣告我們可以通過var關鍵字,然後就可以在程式中使用。當我們不指定變數的預設值時,這些變數的預設值是他們的零值,比如int型別的零值是0,string型別的零值是""
,引用型別的零值是nil
。
對於例子中的兩種型別的宣告,我們可以直接使用,對其進行賦值輸出。但是如果我們換成指標型別呢?
test1.go
package main
import (
"fmt"
)func main()
$ go run test1.go
panic: runtime error: invalid memory address or nil pointer dereference
[signal sigse**: segmentation violation code=0x1 addr=0x0 pc=0x4849df]
goroutine 1 [running]:
main.main()
/home/itheima/go/src/golang_deeper/make_new/t
從這個提示中可以看出,對於引用型別的變數,我們不光要宣告它,還要為它分配內容空間,否則我們的值放在**去呢?這就是上面錯誤提示的原因。
對於值型別的宣告不需要,是因為已經預設幫我們分配好了。
要分配記憶體,就引出來今天的new
和make
。
三、new
對於上面的問題我們如何解決呢?既然我們知道了沒有為其分配記憶體,那麼我們使用new分配乙個吧。
func main()
現在再執行程式,完美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函式這種記憶體置為零的好處,我們再看乙個例子。
test2.go
package main
import (
"fmt"
"sync"
)type user struct
func main()
執行
$ go run test2.go
& 張三 0}
示例中的user型別中的lock欄位我不用初始化,直接可以拿來用,不會有無效記憶體引用異常,因為它已經被零值了。
這就是new,它返回的永遠是型別的指標,指向分配型別的記憶體位址。
四、make
make也是用於記憶體分配的,但是和new不同。
它只用於
的記憶體建立,而且它返回的型別就是這三個型別本身,而不是他們的指標型別,因為這三種型別就是引用型別,所以就沒有必要返回他們的指標了。
注意,因為這三種型別是引用型別,所以必須得初始化,但是不是置為零值,這個和new是不一樣的。
func make(t type, size ...integertype) type
從函式宣告中可以看到,返回的還是該型別。
五、make與new的異同
相同不同
make: 只用於slice、map以及channel的初始化,無可替代
new: 用於型別記憶體分配(初始化值為0), 不常用
new不常用所以有new這個內建函式,可以給我們分配一塊記憶體讓我們使用,但是現實的編碼中,它是不常用的。我們通常都是採用短語句宣告以及結構體的字面量達到我們的目的,比如:
i := 0
u := user{}
make 無可替代我們在使用slice、map以及channel的時候,還是要使用make進行初始化,然後才可以對他們進行操作。
golang中new和make區別
golang 中有兩個記憶體分配機制 new和make,二者有明顯區別 make 返回乙個初始化的例項,返回的是乙個例項,而不是指標,其只能用來初始化 slice,map和channel三種型別 package main import fmt func main 通過這個例子可以看出,當對slice...
Golang的make與new的區別
make用於內建型別 map slice 和channel 的記憶體分配。new用於各種型別的記憶體分配。new的函式宣告 func new type type接受乙個引數,這個引數是乙個型別,分配好記憶體後,返回乙個指向該型別記憶體位址的指標。它同時把分配的記憶體置為零,也就是型別的零值。make...
golang的記憶體模型與new 與make
要徹底理解new 與make 的區別,最好從記憶體模型入手.golang屬於c family,而c程式在unix的內在模型 低位址 text data bss heap unused stack env 高位址 其中 1 text儲存程式主體,即機器指令.2 data,bss儲存全域性變數,data...