欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年03月27日 15:17:17   作者:yongxinz  
本篇文章來(lái)介紹一道非常常見(jiàn)的面試題,到底有多常見(jiàn)呢?可能很多面試的開(kāi)場(chǎng)白就是由此開(kāi)始的。那就是 new 和 make 這兩個(gè)內(nèi)置函數(shù)的區(qū)別,希望對(duì)大家有所幫助

本篇文章來(lái)介紹一道非常常見(jiàn)的面試題,到底有多常見(jiàn)呢?可能很多面試的開(kāi)場(chǎng)白就是由此開(kāi)始的。那就是 new 和 make 這兩個(gè)內(nèi)置函數(shù)的區(qū)別。

其實(shí)這個(gè)問(wèn)題本身并不復(fù)雜,簡(jiǎn)單來(lái)說(shuō)就是,new 只分配內(nèi)存,而 make 只能用于 slice、map 和 chan 的初始化,下面我們就來(lái)詳細(xì)介紹一下。

new

new 是一個(gè)內(nèi)置函數(shù),它會(huì)分配一段內(nèi)存,并返回指向該內(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

從上面的代碼可以看出,new 函數(shù)只接受一個(gè)參數(shù),這個(gè)參數(shù)是一個(gè)類型,并且返回一個(gè)指向該類型內(nèi)存地址的指針。

同時(shí) new 函數(shù)會(huì)把分配的內(nèi)存置為零,也就是類型的零值。

使用

使用 new 函數(shù)為變量分配內(nèi)存空間:

p1?:=?new(int)
fmt.Printf("p1?-->?%#v?\n?",?p1)?//(*int)(0xc42000e250)?
fmt.Printf("p1?point?to?-->?%#v?\n?",?*p1)?//0

var?p2?*int
i?:=?0
p2?=?&i
fmt.Printf("p2?-->?%#v?\n?",?p2)?//(*int)(0xc42000e278)?
fmt.Printf("p2?point?to?-->?%#v?\n?",?*p2)?//0

上面的代碼是等價(jià)的,new(int) 將分配的空間初始化為 int 的零值,也就是 0,并返回 int 的指針,這和直接聲明指針并初始化的效果是相同的。

當(dāng)然,new 函數(shù)不僅能夠?yàn)橄到y(tǒng)默認(rèn)的數(shù)據(jù)類型分配空間,自定義類型也可以使用 new 函數(shù)來(lái)分配空間,如下所示:

type?Student?struct?{
???name?string
???age?int
}
var?s?*Student
s?=?new(Student)?//分配空間
s.name?=?"zhangsan"
fmt.Println(s)

這就是 new 函數(shù),它返回的永遠(yuǎn)是類型的指針,指針指向分配類型的內(nèi)存地址。需要注意的是,new 函數(shù)只會(huì)分配內(nèi)存空間,但并不會(huì)初始化該內(nèi)存空間。

make

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

其函數(shù)簽名如下:

源碼

//?The?make?built-in?function?allocates?and?initializes?an?object?of?type
//?slice,?map,?or?chan?(only).?Like?new,?the?first?argument?is?a?type,?not?a
//?value.?Unlike?new,?make's?return?type?is?the?same?as?the?type?of?its
//?argument,?not?a?pointer?to?it.?The?specification?of?the?result?depends?on
//?the?type:
//?Slice:?The?size?specifies?the?length.?The?capacity?of?the?slice?is
//?equal?to?its?length.?A?second?integer?argument?may?be?provided?to
//?specify?a?different?capacity;?it?must?be?no?smaller?than?the
//?length,?so?make([]int,?0,?10)?allocates?a?slice?of?length?0?and
//?capacity?10.
//?Map:?An?empty?map?is?allocated?with?enough?space?to?hold?the
//?specified?number?of?elements.?The?size?may?be?omitted,?in?which?case
//?a?small?starting?size?is?allocated.
//?Channel:?The?channel's?buffer?is?initialized?with?the?specified
//?buffer?capacity.?If?zero,?or?the?size?is?omitted,?the?channel?is
//?unbuffered.
func?make(t?Type,?size?...IntegerType)?Type

通過(guò)上面的代碼可以看出 make 函數(shù)的 t 參數(shù)必須是 slice、map 和 chan 中的一個(gè),并且返回值也是類型本身。

使用

下面用 slice 來(lái)舉一個(gè)例子:

var?s1?[]int
if?s1?==?nil?{
????fmt.Printf("s1?is?nil?-->?%#v?\n?",?s1)?//?[]int(nil)
}

s2?:=?make([]int,?3)
if?s2?==?nil?{
????fmt.Printf("s2?is?nil?-->?%#v?\n?",?s2)
}?else?{
????fmt.Printf("s2?is?not?nill?-->?%#v?\n?",?s2)//?[]int{0,?0,?0}
}

slice 的零值是 nil,但使用 make 初始化之后,slice 內(nèi)容被類型 int 的零值填充,如:[]int{0, 0, 0}

map 和 chan 也是類似的,就不多說(shuō)了。

總結(jié)

通過(guò)以上分析,總結(jié)一下 new 和 make 主要區(qū)別如下:

  • make 只能用來(lái)分配及初始化類型為 slice、map 和 chan 的數(shù)據(jù)。new 可以分配任意類型的數(shù)據(jù);
  • new 分配返回的是指針,即類型 *Type。make 返回類型本身,即 Type;
  • new 分配的空間被清零。make 分配空間后,會(huì)進(jìn)行初始化;

到此這篇關(guān)于詳解Go語(yǔ)言中new和make關(guān)鍵字的區(qū)別的文章就介紹到這了,更多相關(guān)Go語(yǔ)言 new make內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang基于Vault實(shí)現(xiàn)敏感信息保護(hù)

    Golang基于Vault實(shí)現(xiàn)敏感信息保護(hù)

    Vault?是一個(gè)強(qiáng)大的敏感信息管理工具,自帶了多種認(rèn)證引擎和密碼引擎,本文主要探討應(yīng)用程序如何安全地從?Vault?獲取敏感信息,并進(jìn)一步實(shí)現(xiàn)自動(dòng)輪轉(zhuǎn),感興趣的可以了解一下
    2023-06-06
  • Golang使用singleflight解決并發(fā)重復(fù)請(qǐng)求

    Golang使用singleflight解決并發(fā)重復(fù)請(qǐng)求

    高并發(fā)的場(chǎng)景下,經(jīng)常會(huì)出現(xiàn)并發(fā)重復(fù)請(qǐng)求資源的情況,singleflight是golang內(nèi)置的一個(gè)包,這個(gè)包提供了對(duì)重復(fù)函數(shù)調(diào)用的抑制功能,所以下面我們就來(lái)看看如何使用它解決并發(fā)重復(fù)請(qǐng)求吧
    2023-08-08
  • Go?Build編譯打包文件的完整步驟

    Go?Build編譯打包文件的完整步驟

    go build命令是用于編譯Go語(yǔ)言程序并生成可執(zhí)行文件,它可以將Go源代碼編譯成機(jī)器代碼,并將其打包成可執(zhí)行文件,方便在不同的操作系統(tǒng)上運(yùn)行,這篇文章主要給大家介紹了關(guān)于Go?Build編譯打包文件的完整步驟,需要的朋友可以參考下
    2024-02-02
  • Go作用域的理解

    Go作用域的理解

    在Go語(yǔ)言中,作用域是指變量的可見(jiàn)性范圍,它定義了變量在程序中的生命周期和可訪問(wèn)性,本文主要介紹了Go作用域的理解,包括局部作用域、全局作用域、命名空間作用域等,感興趣的可以了解一下
    2023-11-11
  • golang socket斷點(diǎn)續(xù)傳大文件的實(shí)現(xiàn)方法

    golang socket斷點(diǎn)續(xù)傳大文件的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇golang socket斷點(diǎn)續(xù)傳大文件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • 詳解Go中Set的實(shí)現(xiàn)方式

    詳解Go中Set的實(shí)現(xiàn)方式

    這篇文章主要介紹了詳解Go中Set的實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • GO語(yǔ)言Context的作用及各種使用方法

    GO語(yǔ)言Context的作用及各種使用方法

    golang的Context包是專門用來(lái)處理多個(gè)goroutine之間與請(qǐng)求域的數(shù)據(jù)、取消信號(hào)、截止時(shí)間等相關(guān)操作,下面這篇文章主要給大家介紹了關(guān)于GO語(yǔ)言Context的作用及各種使用方法的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室

    GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室

    今天小編給大家分享一個(gè)簡(jiǎn)單的聊天室功能,聊天室主要功能是用戶可以加入離開(kāi)聊天室,實(shí)現(xiàn)思路也很簡(jiǎn)單明了,下面小編給大家?guī)?lái)了完整代碼,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • Go并發(fā)之RWMutex的源碼解析詳解

    Go并發(fā)之RWMutex的源碼解析詳解

    RWMutex是一個(gè)支持并行讀串行寫的讀寫鎖。RWMutex具有寫操作優(yōu)先的特點(diǎn),寫操作發(fā)生時(shí),僅允許正在執(zhí)行的讀操作執(zhí)行,后續(xù)的讀操作都會(huì)被阻塞。本文就來(lái)從源碼解析一下RWMutex的使用
    2023-03-03
  • 詳解Golang中select的使用與源碼分析

    詳解Golang中select的使用與源碼分析

    select?是?Go?提供的?IO?多路復(fù)用機(jī)制,可以用多個(gè)?case?同時(shí)監(jiān)聽(tīng)多個(gè)?channl?的讀寫狀態(tài)。本文將從源碼角度帶大家了解一下select的使用,需要的可以參考一下
    2022-12-12

最新評(píng)論