真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Go語言new與make的區(qū)別是什么

Go語言new與make的區(qū)別是什么?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出普陀免費(fèi)做網(wǎng)站回饋大家。

變量的聲明

var i int
var s string

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

對(duì)于例子中的兩種類型的聲明,我們可以直接使用,對(duì)其進(jìn)行賦值輸出。但是如果我們換成引用類型呢?

package main
import (
 "fmt"
)
func main() {
 var i *int
 *i=10
 fmt.Println(*i)
}

這個(gè)例子會(huì)打印出什么?0還是10?。以上全錯(cuò),運(yùn)行的時(shí)候會(huì)painc,原因如下:

panic: runtime error: invalid memory address or nil pointer dereference

從這個(gè)提示中可以看出,對(duì)于引用類型的變量,我們不光要聲明它,還要為它分配內(nèi)容空間,否則我們的值放在哪里去呢?這就是上面錯(cuò)誤提示的原因。

對(duì)于值類型的聲明不需要,是因?yàn)橐呀?jīng)默認(rèn)幫我們分配好了。

要分配內(nèi)存,就引出來今天的new和make。

new

對(duì)于上面的問題我們?nèi)绾谓鉀Q呢?既然我們知道了沒有為其分配內(nèi)存,那么我們使用new分配一個(gè)吧。

func main() {
 var i *int
 i=new(int)
 *i=10
 fmt.Println(*i)
}

現(xiàn)在再運(yùn)行程序,完美PASS,打印10?,F(xiàn)在讓我們看下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ù),這個(gè)參數(shù)是一個(gè)類型,分配好內(nèi)存后,返回一個(gè)指向該類型內(nèi)存地址的指針。同時(shí)請(qǐng)注意它同時(shí)把分配的內(nèi)存置為零,也就是類型的零值。

我們的例子中,如果沒有*i=10,那么打印的就是0。這里體現(xiàn)不出來new函數(shù)這種內(nèi)存置為零的好處,我們?cè)倏匆粋€(gè)例子。

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字段我不用初始化,直接可以拿來用,不會(huì)有無效內(nèi)存引用異常,因?yàn)樗呀?jīng)被零值了。

這就是new,它返回的永遠(yuǎn)是類型的指針,指向分配類型的內(nèi)存地址。

make

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

注意,因?yàn)檫@三種類型是引用類型,所以必須得初始化,但是不是置為零值,這個(gè)和new是不一樣的。

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

從函數(shù)聲明中可以看到,返回的還是該類型。

二者異同

所以從這里可以看的很明白了,二者都是內(nèi)存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于類型的內(nèi)存分配,并且內(nèi)存置為零。所以在我們編寫程序的時(shí)候,就可以根據(jù)自己的需要很好的選擇了。

make返回的還是這三個(gè)引用類型本身;而new返回的是指向類型的指針。

其實(shí)new不常用

所以有new這個(gè)內(nèi)置函數(shù),可以給我們分配一塊內(nèi)存讓我們使用,但是現(xiàn)實(shí)的編碼中,它是不常用的。我們通常都是采用短語句聲明以及結(jié)構(gòu)體的字面量達(dá)到我們的目的,比如:

i:=0
u:=user{}

這樣更簡(jiǎn)潔方便,而且不會(huì)涉及到指針這種比麻煩的操作。

make函數(shù)是無可替代的,我們?cè)谑褂胹lice、map以及channel的時(shí)候,還是要使用make進(jìn)行初始化,然后才才可以對(duì)他們進(jìn)行操作。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。


當(dāng)前名稱:Go語言new與make的區(qū)別是什么
文章網(wǎng)址:http://weahome.cn/article/gjsosj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部