Go中new和make的区别
Go中new和make的區(qū)別
變量聲明
當(dāng)我們聲明變量時可以使用var關(guān)鍵字,當(dāng)不指定變量的默認(rèn)值時,這些變量的默認(rèn)值就是他們的零值,比如int的默認(rèn)值為0,string的默認(rèn)值為"",引用類型的零值為nil。
但是當(dāng)我們在聲明引用類型的變量并直接使用時,會panic。
package mainimport "fmt"func main() {var i *int*i = 10fmt.Println(*i) }//output: panic: runtime error: invalid memory address or nil pointer dereference所以,對于引用型變量時,除了要聲明它以外,還要為其分配空間。要分配內(nèi)存,就需要使用make或者new。
new
上面的問題使用new我們可以這樣解決:
package mainimport "fmt"func main() {var i *inti = new(int)*i = 10fmt.Println(*i) } //output: 10對于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ù),內(nèi)存分配完畢之后,會返回一個指向該內(nèi)存的同類型的指針,同時將該內(nèi)存的值改為該類型的零值。
再看一個例子:
package mainimport ("fmt""sync" )type user struct {lock sync.Mutexname stringage int }func main() {u := new(user)u.lock.Lock()u.name = "demo"u.lock.Unlock()fmt.Println(u) }在這個例子中可以看到使用new的好處,在user中l(wèi)ock不需要自行的去初始化,new之后,可以直接使用。
make
make也是用于內(nèi)存分配,但是和new不同的是:它只用于chan、map以及切片的內(nèi)存創(chuàng)建,而且它返回的類型就是這三個類型本身,而不是它們的指針類型,因為這三種類型就是引用類型,所以沒有必要返回它們的指針。
func make(t Type, size ...IntegerType) Type異同
二者都是在堆上進(jìn)行內(nèi)存分配,但make只用于slice、map、channel的初始化;make返回的還是這三個引用類型本身,而new返回的是指向類型的指針;
為什么既有make又有new?
rujews:使用make的好處是可以指定len和cap,make(type,len,cap),合適的len和cap可以提升性能。
YahuiAn:在使用make()函數(shù)創(chuàng)建切片時,如果我們能夠預(yù)計出合理的容量大小(太大浪費(fèi)內(nèi)存空間,太小會不斷的擴(kuò)容),哪么我們在進(jìn)行切片的append時,可能不會發(fā)生擴(kuò)容,也就避免了切片元素的復(fù)制,減少了開銷。
總結(jié)
以上是生活随笔為你收集整理的Go中new和make的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广汽合创 A06 PLUS 车型上市:C
- 下一篇: 性能飞跃!传骁龙8 Gen4多核跑分达1