日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go中new和make的区别

發(fā)布時(shí)間:2023/12/4 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go中new和make的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Go中new和make的區(qū)別

變量聲明

當(dāng)我們聲明變量時(shí)可以使用var關(guān)鍵字,當(dāng)不指定變量的默認(rèn)值時(shí),這些變量的默認(rèn)值就是他們的零值,比如int的默認(rèn)值為0,string的默認(rèn)值為"",引用類型的零值為nil。

但是當(dāng)我們?cè)诼暶饕妙愋偷淖兞坎⒅苯邮褂脮r(shí),會(huì)panic。

package mainimport "fmt"func main() {var i *int*i = 10fmt.Println(*i) }//output: panic: runtime error: invalid memory address or nil pointer dereference

所以,對(duì)于引用型變量時(shí),除了要聲明它以外,還要為其分配空間。要分配內(nèi)存,就需要使用make或者new。

new

上面的問題使用new我們可以這樣解決:

package mainimport "fmt"func main() {var i *inti = new(int)*i = 10fmt.Println(*i) } //output: 10

對(duì)于new這個(gè)內(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

它只接受一個(gè)類型參數(shù),內(nèi)存分配完畢之后,會(huì)返回一個(gè)指向該內(nèi)存的同類型的指針,同時(shí)將該內(nèi)存的值改為該類型的零值。

再看一個(gè)例子:

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) }

在這個(gè)例子中可以看到使用new的好處,在user中l(wèi)ock不需要自行的去初始化,new之后,可以直接使用。

make

make也是用于內(nèi)存分配,但是和new不同的是:它只用于chan、map以及切片的內(nèi)存創(chuàng)建,而且它返回的類型就是這三個(gè)類型本身,而不是它們的指針類型,因?yàn)檫@三種類型就是引用類型,所以沒有必要返回它們的指針。

func make(t Type, size ...IntegerType) Type

異同

二者都是在堆上進(jìn)行內(nèi)存分配,但make只用于slice、map、channel的初始化;make返回的還是這三個(gè)引用類型本身,而new返回的是指向類型的指針;

為什么既有make又有new?

rujews:使用make的好處是可以指定len和cap,make(type,len,cap),合適的len和cap可以提升性能。

YahuiAn:在使用make()函數(shù)創(chuàng)建切片時(shí),如果我們能夠預(yù)計(jì)出合理的容量大小(太大浪費(fèi)內(nèi)存空間,太小會(huì)不斷的擴(kuò)容),哪么我們?cè)谶M(jìn)行切片的append時(shí),可能不會(huì)發(fā)生擴(kuò)容,也就避免了切片元素的復(fù)制,減少了開銷。

總結(jié)

以上是生活随笔為你收集整理的Go中new和make的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。