最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

new

new 是一個內(nèi)置函數(shù),它會分配一段內(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ù)只接受一個參數(shù),這個參數(shù)是一個類型,并且返回一個指向該類型內(nèi)存地址的指針。

同時 new 函數(shù)會把分配的內(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

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

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

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ù)只會分配內(nèi)存空間,但并不會初始化該內(nèi)存空間。

make

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

其函數(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

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

使用

下面用 slice 來舉一個例子:

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 也是類似的,就不多說了。

總結(jié)

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

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

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

相關(guān)文章

  • Golang Slice和map的坑

    Golang Slice和map的坑

    Golang中的Slice和Map在內(nèi)存空間上,有一些不同,本文主要介紹了Golang Slice和map的坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • 一文帶你深入了解Golang中的自旋鎖

    一文帶你深入了解Golang中的自旋鎖

    自旋鎖是一種忙等待鎖,當(dāng)一個線程嘗試獲取一個已經(jīng)被其它線程持有的鎖時,這個線程會持續(xù)循環(huán)檢查鎖的狀態(tài)(即“自旋”)?,直到鎖被釋放后獲得所有權(quán),下面我們就來深入了解下自旋鎖的具體操作吧
    2024-01-01
  • Go方法接收者值接收者與指針接收者詳解

    Go方法接收者值接收者與指針接收者詳解

    這篇文章主要為大家介紹了Go方法接收者值接收者與指針接收者詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Golang設(shè)計模式之外觀模式的實現(xiàn)

    Golang設(shè)計模式之外觀模式的實現(xiàn)

    這篇文章主要介紹了Golang設(shè)計模式之外觀模式的實現(xiàn),外觀模式是一種常用的設(shè)計模式之一,是一種結(jié)構(gòu)型設(shè)計模式,它提供了一個簡單的接口來訪問復(fù)雜系統(tǒng)的各種功能,從而降低了系統(tǒng)的復(fù)雜度,需要詳細(xì)了解可以參考下文
    2023-05-05
  • GO workPool的線程池實現(xiàn)

    GO workPool的線程池實現(xiàn)

    本文主要介紹了GO workPool的線程池實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang守護(hù)進(jìn)程用法示例

    golang守護(hù)進(jìn)程用法示例

    這篇文章主要介紹了golang守護(hù)進(jìn)程用法,結(jié)合實例形式分析了Go語言守護(hù)進(jìn)程的具體實現(xiàn)與使用技巧,需要的朋友可以參考下
    2016-07-07
  • 淺析Go語言中的同步與異步處理

    淺析Go語言中的同步與異步處理

    在開發(fā)過程中,當(dāng)需要同時處理多個操作時,開發(fā)者經(jīng)常面臨同步和異步兩種處理方式的選擇,下面小編就來和大家詳細(xì)介紹一下Go語言中的同步與異步處理吧
    2023-11-11
  • Go語言常用條件判斷空值邏輯的使用

    Go語言常用條件判斷空值邏輯的使用

    本文主要介紹了Go語言常用條件判斷空值邏輯的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Golang中Bit數(shù)組的實現(xiàn)方式

    Golang中Bit數(shù)組的實現(xiàn)方式

    這篇文章主要介紹了Golang中Bit數(shù)組的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 詳解Golang如何實現(xiàn)支持隨機刪除元素的堆

    詳解Golang如何實現(xiàn)支持隨機刪除元素的堆

    堆是一種非常常用的數(shù)據(jù)結(jié)構(gòu),它能夠支持在O(1)的時間復(fù)雜度獲取到最大值(或最小值)。本文主要介紹了如何實現(xiàn)支持O(log(n))隨機刪除元素的堆,需要的可以參考一下
    2022-09-09

最新評論

民县| 连州市| 麻阳| 普兰县| 石柱| 大丰市| 玉林市| 民勤县| 赤城县| 策勒县| 北宁市| 简阳市| 磐安县| 渭南市| 石城县| 思茅市| 桦甸市| 长武县| 高阳县| 安陆市| 多伦县| 清远市| 班玛县| 固始县| 鸡西市| 乐平市| 宜昌市| 稷山县| 绍兴市| 扬中市| 咸阳市| 礼泉县| 乐东| 昔阳县| 准格尔旗| 当阳市| 响水县| 南汇区| 奉贤区| 军事| 定兴县|