Go語(yǔ)言make和new關(guān)鍵字的區(qū)別

關(guān)鍵點(diǎn)

1募壕、分配內(nèi)存的內(nèi)置函數(shù)是newmake

2南蓬、new 方式 分配內(nèi)存纺非,并不常用,一般使用短式和結(jié)構(gòu)體字面量的方式

3蓖康、new 不能用于map铐炫, channel垒手, 切片的聲明

4蒜焊、new 分配時(shí),接收的是類型科贬,返回的是該類型的指針泳梆,并且默認(rèn)? ?初始化

5、make 分配后榜掌,沒(méi)有初始化优妙,需要顯示初始化

6、make 分配內(nèi)存后憎账,返還的是該類型

image

7套硼、make的使用場(chǎng)景? 下面三個(gè)進(jìn)行聲明初始化時(shí)用

  • channel

  • 切片

  • map

8胞皱、sync.Map, 以及 sync.Mutex 這兩個(gè)可以直接 通過(guò)var來(lái)聲明變量邪意,不需要 初始化

  • var map2 sync.Map

  • var mu sync.Mutex,

? ?可以直接使用map2, mu變量反砌,操作

9雾鬼、普通變量,聲明后宴树,就有默認(rèn)的初始化值 ,可以直接使用

10策菜、引用類型,需要聲明酒贬、分配內(nèi)存 兩步又憨;如果只是聲明,操作時(shí)會(huì)拋異常

1锭吨、前言

本文主要給大家介紹了Go語(yǔ)言中函數(shù)new與make的使用和區(qū)別蠢莺,

關(guān)于Go語(yǔ)言中new和make是內(nèi)建的兩個(gè)函數(shù),主要用來(lái)創(chuàng)建分配類型內(nèi)存耐齐。

在我們定義生成變量的時(shí)候浪秘,可能會(huì)覺得有點(diǎn)迷惑蒋情,其實(shí)他們的規(guī)則很簡(jiǎn)單,

下面我們就通過(guò)一些示例說(shuō)明他們的區(qū)別和使用耸携,話不多說(shuō)了棵癣,來(lái)一起看看詳細(xì)的介紹吧。

2夺衍、變量的聲明

var I int
var s string

變量的聲明我們可以通過(guò)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)
}
image

從這個(gè)提示中可以看出务甥,對(duì)于引用類型的變量,我們不光要聲明它喳篇,還要為它分配內(nèi)寸空間敞临,否則我們的值放在哪里去呢

這就是上面錯(cuò)誤提示的原因麸澜。

對(duì)于值類型的聲明不需要挺尿,是因?yàn)橐呀?jīng)默認(rèn)幫我們分配好了
要分配內(nèi)存炊邦,就引出來(lái)今天的new和make编矾。

3、new 方式

對(duì)于上面的問(wèn)題我們?nèi)绾谓鉀Q呢铣耘?

既然我們知道了沒(méi)有為其分配內(nèi)存洽沟,那么我們使用new分配一個(gè)吧。

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

現(xiàn)在再運(yùn)行程序蜗细,完美PASS裆操,打印10。

現(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)存置為零,也就是類型的零值白粉。

我們的例子中传泊,如果沒(méi)有*i=10鼠渺,那么打印的就是0。

這里體現(xiàn)不出來(lái)new函數(shù)這種內(nèi)存置為零的好處眷细,我們?cè)倏匆粋€(gè)例子拦盹。

package main

import (
    "sync"
    "fmt"
)

type user struct {
    lock sync.Mutex
    name string
    age  int
}

func main() {
    u := new(user)

    u.lock.Lock()
    u.name = "張三"
    u.lock.Unlock()

    fmt.Println(u)
}

image

示例中的user類型中的lock字段我不用初始化直接可以拿來(lái)溪椎,

不會(huì)無(wú)效內(nèi)存引用異常普舆,因?yàn)樗呀?jīng)被零值了。

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

4歉秫、make 方式

  • make也是用于內(nèi)存分配的蛾洛,但是和new不同,

  • 它只用于chan端考、map以及切片的內(nèi)存創(chuàng)建雅潭,

  • 而且它返回的類型就是這三個(gè)類型本身

  • 而不是他們的指針類型却特,

    • 因?yàn)檫@三種類型就是引用類型,所以就沒(méi)有必要返回他們的指針了筛圆。

注意裂明,因?yàn)檫@三種類型是引用類型,所以必須初始化太援,

但是不是置為零值闽晦,這個(gè)和new是不一樣的。

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

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

5、new 與 make的不同點(diǎn)

所以從這里可以看的很明白了碱蒙,二者都是內(nèi)存的分配(堆上)荠瘪,

但是make只用于slice、map以及channel的初始化(非零值)赛惩;

而new用于類型的內(nèi)存分配哀墓,并且內(nèi)存置為零

所以在我們編寫程序的時(shí)候喷兼,就可以根據(jù)自己的需要很好的選擇了篮绰。

make返回的還是這三個(gè)引用類型本身;

而new返回的是指向類型的指針季惯。

6吠各、其實(shí)new 不常用

所以有new這個(gè)內(nèi)置函數(shù)臀突,可以給我們分配一塊內(nèi)存讓我們使用,

但是現(xiàn)實(shí)的編碼中贾漏,它是不常用的惧辈。

我們通常都是采用短語(yǔ)句聲明以及結(jié)構(gòu)體的字面量達(dá)到我們的目的,

比如:

I:=0
u:=user{}

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

make函數(shù)是無(wú)可替代的,我們?cè)谑褂胹lice困食、map以及channel的時(shí)候边翁,

還是要使用make進(jìn)行初始化,然后才才可以對(duì)他們進(jìn)行操作硕盹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末符匾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瘩例,更是在濱河造成了極大的恐慌啊胶,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垛贤,死亡現(xiàn)場(chǎng)離奇詭異焰坪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)聘惦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門某饰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人善绎,你說(shuō)我怎么就攤上這事黔漂。” “怎么了禀酱?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵炬守,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我剂跟,道長(zhǎng)减途,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任浩聋,我火速辦了婚禮观蜗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衣洁。我一直安慰自己墓捻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砖第,像睡著了一般撤卢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梧兼,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天放吩,我揣著相機(jī)與錄音,去河邊找鬼羽杰。 笑死渡紫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的考赛。 我是一名探鬼主播惕澎,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颜骤!你這毒婦竟也來(lái)了唧喉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤忍抽,失蹤者是張志新(化名)和其女友劉穎八孝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸠项,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡干跛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锈锤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驯鳖。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖久免,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扭弧,我是刑警寧澤阎姥,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站鸽捻,受9級(jí)特大地震影響呼巴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜御蒲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一衣赶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厚满,春花似錦府瞄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鲸郊。三九已至,卻和暖如春货邓,著一層夾襖步出監(jiān)牢的瞬間秆撮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工换况, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留职辨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓戈二,卻偏偏與公主長(zhǎng)得像舒裤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挽拂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容