前言
本文主要給大家介紹了Go語言中函數(shù)new與make的使用和區(qū)別,關(guān)于Go語言中new和make是內(nèi)建的兩個函數(shù),主要用來創(chuàng)建分配類型內(nèi)存。在我們定義生成變量的時候,可能會覺得有點迷惑,其實他們的規(guī)則很簡單,下面我們就通過一些示例說明他們的區(qū)別和使用,話不多說了,來一起看看詳細(xì)的介紹吧。
變量的聲明
變量的聲明我們可以通過var關(guān)鍵字,然后就可以在程序中使用。當(dāng)我們不指定變量的默認(rèn)值時,這些變量的默認(rèn)值是他們的零值,比如int類型的零值是0,string類型的零值是"",引用類型的零值是nil。
對于例子中的兩種類型的聲明,我們可以直接使用,對其進(jìn)行賦值輸出。但是如果我們換成引用類型呢?
package main
import (
"fmt"
)
func main() {
var i *int
*i=10
fmt.Println(*i)
}
這個例子會打印出什么?0還是10?。以上全錯,運(yùn)行的時候會painc,原因如下:
panic: runtime error: invalid memory address or nil pointer dereference
從這個提示中可以看出,對于引用類型的變量,我們不光要聲明它,還要為它分配內(nèi)容空間,否則我們的值放在哪里去呢?這就是上面錯誤提示的原因。
對于值類型的聲明不需要,是因為已經(jīng)默認(rèn)幫我們分配好了。
要分配內(nèi)存,就引出來今天的new和make。
new
對于上面的問題我們?nèi)绾谓鉀Q呢?既然我們知道了沒有為其分配內(nèi)存,那么我們使用new分配一個吧。
func main() {
var i *int
i=new(int)
*i=10
fmt.Println(*i)
}
現(xiàn)在再運(yùn)行程序,完美PASS,打印10?,F(xiàn)在讓我們看下new這個內(nèi)置的函數(shù)。
// 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
它只接受一個參數(shù),這個參數(shù)是一個類型,分配好內(nèi)存后,返回一個指向該類型內(nèi)存地址的指針。同時請注意它同時把分配的內(nèi)存置為零,也就是類型的零值。
我們的例子中,如果沒有*i=10,那么打印的就是0。這里體現(xiàn)不出來new函數(shù)這種內(nèi)存置為零的好處,我們再看一個例子。
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字段我不用初始化,直接可以拿來用,不會有無效內(nèi)存引用異常,因為它已經(jīng)被零值了。
這就是new,它返回的永遠(yuǎn)是類型的指針,指向分配類型的內(nèi)存地址。
make
make也是用于內(nèi)存分配的,但是和new不同,它只用于chan、map以及切片的內(nèi)存創(chuàng)建,而且它返回的類型就是這三個類型本身,而不是他們的指針類型,因為這三種類型就是引用類型,所以就沒有必要返回他們的指針了。
注意,因為這三種類型是引用類型,所以必須得初始化,但是不是置為零值,這個和new是不一樣的。
func make(t Type, size ...IntegerType) Type
從函數(shù)聲明中可以看到,返回的還是該類型。
二者異同
所以從這里可以看的很明白了,二者都是內(nèi)存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于類型的內(nèi)存分配,并且內(nèi)存置為零。所以在我們編寫程序的時候,就可以根據(jù)自己的需要很好的選擇了。
make返回的還是這三個引用類型本身;而new返回的是指向類型的指針。
其實new不常用
所以有new這個內(nèi)置函數(shù),可以給我們分配一塊內(nèi)存讓我們使用,但是現(xiàn)實的編碼中,它是不常用的。我們通常都是采用短語句聲明以及結(jié)構(gòu)體的字面量達(dá)到我們的目的,比如:
這樣更簡潔方便,而且不會涉及到指針這種比麻煩的操作。
make函數(shù)是無可替代的,我們在使用slice、map以及channel的時候,還是要使用make進(jìn)行初始化,然后才才可以對他們進(jìn)行操作。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
您可能感興趣的文章:- Go語言中new()和 make()的區(qū)別詳解
- golang中make和new的區(qū)別示例詳解
- Go語言里的new函數(shù)用法分析
- GO語言make()分配用法實例