亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

golang中new與make的區(qū)別講解

 更新時(shí)間:2023年01月12日 14:53:03   作者:捶捶自己  
new只能開(kāi)辟單個(gè)空間,不能為引用類型開(kāi)辟多個(gè)空間,并且new是對(duì)類型進(jìn)行內(nèi)存的開(kāi)辟,返回一個(gè)指向該內(nèi)存空間的指針類型,如果使用new去初始化引用數(shù)據(jù)類型,不是很合適(當(dāng)然,new一個(gè)對(duì)象還是可以的),因此就需要用到另一個(gè)內(nèi)置函數(shù)make,需要的朋友可以參考下

new和make

new

// 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

對(duì)于官方是這么解釋new的:這個(gè)內(nèi)置函數(shù)功能是分配內(nèi)存。第一個(gè)參數(shù)是一個(gè)自定義類型,并不是一個(gè)值,返回值為一個(gè)指向新分配好的內(nèi)存空間的一個(gè)指定類型指針,并且這個(gè)內(nèi)存空間會(huì)被清零(也就是變?yōu)樵擃愋偷牧阒担?/p>

使用new初始化

至于使用new進(jìn)行初始化,根據(jù)語(yǔ)言規(guī)范:The built-in function new takes a type T and returns a value of type *T. The memory [pointed to] is initialized as described in the section on initial values.因?yàn)間o中的函數(shù)不能被重載,并且這不是可變參數(shù),所以無(wú)法傳遞任何初始化數(shù)據(jù)。 取而代之的是,go將使用對(duì)類型和任何成員字段適當(dāng)?shù)娜魏?版本進(jìn)行初始化。

零值

go語(yǔ)言總共分為四大類型:基本數(shù)據(jù)類型、復(fù)雜數(shù)據(jù)類型、引用數(shù)據(jù)類型和接口類型。零值是指基本數(shù)據(jù)類型和指針的初始值。
數(shù)值型零值為0、string的零值為""、bool的零值為false、指針的零值為nil

使用示例(new也可以為數(shù)組分配內(nèi)存)

 a := new(int)
 fmt.Printf("類型為:%T, 值為:%v\n", a, a)
 fmt.Printf("類型為:%T, 值為:%v\n", *a, *a)
 b := new(string)
 fmt.Printf("類型為:%T, 值為:%v\n", b, b)
 fmt.Printf("類型為:%T, 值為:%v\n", *b, *b)
 c := new(*int)
 fmt.Printf("類型為:%T, 值為:%v\n", c, c)
 fmt.Printf("類型為:%T, 值為:%v\n", *c, *c)
 
 運(yùn)行結(jié)果:
 類型為:*int, 值為:0xc0000a6058
 類型為:int, 值為:0               
 類型為:*string, 值為:0xc000088220
 類型為:string, 值為:             
 類型為:**int, 值為:0xc0000ca020  
 類型為:*int, 值為:<nil>  

new(struct)和&struct{}區(qū)別

因?yàn)?code>struct{}這種操作可以對(duì)類型進(jìn)行初始化,并且基于上述new的理解之后就會(huì)發(fā)現(xiàn)&struct{}new(struct)其實(shí)這兩種聲明方式幾乎沒(méi)有區(qū)別。但我們?cè)陧?xiàng)目中經(jīng)常會(huì)使用到這兩種操作,就自然會(huì)想這兩者的區(qū)別(跟本人一樣)。

在我調(diào)查了一些資料后,我個(gè)人覺(jué)得他們唯一的區(qū)別就在于new只能聲明一個(gè)零值的該類型的指針并返回,但是&struct{}可以在聲明的同時(shí)進(jìn)行初始化操作。

func main(){
	A := new(struct) // 只能返回一個(gè)struct的指針
	B := &struct{Id:1,Name:"張三"} // 可以返回一個(gè)帶有默認(rèn)值的struct的指針
}

上述例子就很好的說(shuō)明了這個(gè)問(wèn)題。

小結(jié)

new只能開(kāi)辟單個(gè)空間,不能為引用類型開(kāi)辟多個(gè)空間。并且new是對(duì)類型進(jìn)行內(nèi)存的開(kāi)辟,返回一個(gè)指向該內(nèi)存空間的指針類型。如果使用new去初始化引用數(shù)據(jù)類型,不是很合適(當(dāng)然,new一個(gè)對(duì)象還是可以的)。因此就需要用到另一個(gè)內(nèi)置函數(shù)make。

make

// 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:
func make(t Type, size ...IntegerType) Type

對(duì)于官方是這么解釋make的:該函數(shù)功能是分配內(nèi)存并且初始化一個(gè)切片(slice/map/channel)類型的對(duì)象。相比較內(nèi)置函數(shù)new而言,make的第一個(gè)參數(shù)也是一個(gè)自定義類型,不是一個(gè)值。但make的返回類型是一個(gè)和他傳入的自定義參數(shù)類型完全相同的類型。并不是一個(gè)指針去指向這個(gè)新開(kāi)辟的內(nèi)存空間。

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

簡(jiǎn)述make的初始化(slice/map/channel)

在這里插入圖片描述

make在對(duì)slice/map/channel這三種類型進(jìn)行初始化時(shí),在編譯初期階段,go語(yǔ)言就已經(jīng)將代表make關(guān)鍵字的OMAKE節(jié)點(diǎn)根據(jù)參數(shù)類型的不同轉(zhuǎn)換成了OMAKESLICE、OMAKEMAP、OMAKECHAN三種不同類型的節(jié)點(diǎn)。這些不同的節(jié)點(diǎn)最終會(huì)調(diào)用不同的運(yùn)行時(shí)函數(shù)來(lái)初始化數(shù)據(jù)結(jié)構(gòu)。

使用示例

var a []int
fmt.Println(a[0])
// 運(yùn)行結(jié)果
panic: runtime error: index out of range [0] with length 0

如果不對(duì)切片進(jìn)行初始化,就無(wú)法使用

 var a []int
 a = make([]int, 1)
 fmt.Println(a[0])

mapchan也同理。切片需要指定長(zhǎng)度大小,容量可以自動(dòng)擴(kuò)容。如果下標(biāo)超出指定的長(zhǎng)度也會(huì)出現(xiàn)數(shù)組越界的情況。但是map不會(huì)發(fā)生該情況。即使初始化map容量為0,map底層也會(huì)自動(dòng)進(jìn)行擴(kuò)容。對(duì)于channel來(lái)說(shuō)初始化容量就是初始化緩沖區(qū)長(zhǎng)度。

總結(jié):

makenew共同點(diǎn)都是可以開(kāi)辟內(nèi)存空間,給變量分配內(nèi)存。
不同點(diǎn)在于:

  • 兩者的作用類型不同,newint、string、數(shù)組分配內(nèi)存,makeslice、map、channel分配內(nèi)存。
  • 兩者的返回值不同,new的返回值類型為一個(gè)指向新分配好的內(nèi)存空間的一個(gè)指定類型指針。而make的返回值類型為它本身。
  • new分配的內(nèi)存空間會(huì)被清零。make分配空間之后會(huì)被初始化。
  • new分配的內(nèi)存空間不一定會(huì)在堆上分配,當(dāng)指向這個(gè)內(nèi)存空間的指針變量作用域不會(huì)在作用域外被使用,或者說(shuō)這個(gè)變量只使用一次就不再使用。那么new分配的內(nèi)存空間就會(huì)在當(dāng)前的函數(shù)棧中隨著棧的結(jié)束而被銷毀。make則會(huì)在棧上開(kāi)辟一塊棧幀,棧幀里面有棧的指針和棧頂指針,分別記錄棧幀的空間,隨著函數(shù)的執(zhí)行完畢,棧里的棧幀就會(huì)自動(dòng)清空。

簡(jiǎn)單的說(shuō),new只分配內(nèi)存,make用于slice,map,和channel的初始化,并且不返回指針。要獲得一個(gè)顯式的指針,使用new進(jìn)行分配,或者顯式地使用一個(gè)變量的地址。

參考資料

go語(yǔ)言中文網(wǎng)
深入學(xué)習(xí)golang

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

相關(guān)文章

  • golang壓縮與解壓縮文件的示例代碼

    golang壓縮與解壓縮文件的示例代碼

    這篇文章主要給大家介紹了golang壓縮與解壓縮文件,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 如何使用Golang發(fā)送Get和Post請(qǐng)求

    如何使用Golang發(fā)送Get和Post請(qǐng)求

    這篇文章主要給大家介紹了關(guān)于如何使用Golang發(fā)送Get和Post請(qǐng)求的相關(guān)資料,Go語(yǔ)言(Golang)的標(biāo)準(zhǔn)庫(kù)提供了處理HTTP請(qǐng)求的功能,這使得將Go用于web應(yīng)用程序變得非常容易,需要的朋友可以參考下
    2023-06-06
  • go語(yǔ)言題解LeetCode674最長(zhǎng)連續(xù)遞增序列

    go語(yǔ)言題解LeetCode674最長(zhǎng)連續(xù)遞增序列

    這篇文章主要為大家介紹了go語(yǔ)言題解LeetCode674最長(zhǎng)連續(xù)遞增序列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go語(yǔ)言簡(jiǎn)介和環(huán)境配置

    Go語(yǔ)言簡(jiǎn)介和環(huán)境配置

    Go語(yǔ)言保證了既能到達(dá)靜態(tài)編譯語(yǔ)言的安全和性能,又達(dá)到了動(dòng)態(tài)語(yǔ)言開(kāi)發(fā)速度和易維護(hù)性,有人形容Go語(yǔ)言:Go=?C?+?Python?,?說(shuō)明Go語(yǔ)言既有C靜態(tài)語(yǔ)言程序的運(yùn)行速度,又能達(dá)到Python動(dòng)態(tài)語(yǔ)言的快速開(kāi)發(fā),這篇文章主要介紹了Go介紹和環(huán)境配置,需要的朋友可以參考下
    2022-07-07
  • 在Golang中使用iota案例詳解

    在Golang中使用iota案例詳解

    在Go語(yǔ)言中,iota是一個(gè)預(yù)定義的標(biāo)識(shí)符,用于在常量聲明中生成連續(xù)的遞增值,iota的值從0開(kāi)始,每次在常量聲明中使用時(shí)遞增,本就給大家講解一下Golang中iota的使用案例,感興趣的同學(xué)跟著小編一起來(lái)看看吧
    2023-07-07
  • Golang極簡(jiǎn)入門教程(二):方法和接口

    Golang極簡(jiǎn)入門教程(二):方法和接口

    這篇文章主要介紹了Golang極簡(jiǎn)入門教程(二):方法和接口,本文同時(shí)講解了錯(cuò)誤、匿名域等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • go語(yǔ)言中if語(yǔ)句用法實(shí)例

    go語(yǔ)言中if語(yǔ)句用法實(shí)例

    這篇文章主要介紹了go語(yǔ)言中if語(yǔ)句用法,以實(shí)例形式分析了if語(yǔ)句的定義及使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • goland把go項(xiàng)目打包進(jìn)docker鏡像的全過(guò)程記錄

    goland把go項(xiàng)目打包進(jìn)docker鏡像的全過(guò)程記錄

    golang編譯的應(yīng)用是不需要依賴其他運(yùn)行環(huán)境的,下面這篇文章主要給大家介紹了關(guān)于goland把go項(xiàng)目打包進(jìn)docker鏡像的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Go string轉(zhuǎn)int,int64,int32及注意事項(xiàng)說(shuō)明

    Go string轉(zhuǎn)int,int64,int32及注意事項(xiàng)說(shuō)明

    這篇文章主要介紹了Go string轉(zhuǎn)int,int64,int32及注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Goland IDEA項(xiàng)目多開(kāi)設(shè)置方式

    Goland IDEA項(xiàng)目多開(kāi)設(shè)置方式

    這篇文章主要介紹了Goland IDEA項(xiàng)目多開(kāi)設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論