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

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

 更新時間:2023年01月12日 14:53:03   作者:捶捶自己  
new只能開辟單個空間,不能為引用類型開辟多個空間,并且new是對類型進行內(nèi)存的開辟,返回一個指向該內(nèi)存空間的指針類型,如果使用new去初始化引用數(shù)據(jù)類型,不是很合適(當然,new一個對象還是可以的),因此就需要用到另一個內(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

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

使用new初始化

至于使用new進行初始化,根據(jù)語言規(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.因為go中的函數(shù)不能被重載,并且這不是可變參數(shù),所以無法傳遞任何初始化數(shù)據(jù)。 取而代之的是,go將使用對類型和任何成員字段適當?shù)娜魏?版本進行初始化。

零值

go語言總共分為四大類型:基本數(shù)據(jù)類型、復雜數(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)
 
 運行結果:
 類型為:*int, 值為:0xc0000a6058
 類型為:int, 值為:0               
 類型為:*string, 值為:0xc000088220
 類型為:string, 值為:             
 類型為:**int, 值為:0xc0000ca020  
 類型為:*int, 值為:<nil>  

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

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

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

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

上述例子就很好的說明了這個問題。

小結

new只能開辟單個空間,不能為引用類型開辟多個空間。并且new是對類型進行內(nèi)存的開辟,返回一個指向該內(nèi)存空間的指針類型。如果使用new去初始化引用數(shù)據(jù)類型,不是很合適(當然,new一個對象還是可以的)。因此就需要用到另一個內(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

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

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

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

在這里插入圖片描述

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

使用示例

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

如果不對切片進行初始化,就無法使用

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

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

總結:

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

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

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

參考資料

go語言中文網(wǎng)
深入學習golang

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

相關文章

  • 淺談Golang空白導入的真正用途

    淺談Golang空白導入的真正用途

    在Go語言中,空白導入的核心用途是為了執(zhí)行被導入包的 init 函數(shù),從而觸發(fā)其初始化副作用,而無需在代碼中直接使用該包的導出標識符,下面就來詳細的介紹一下Golang空白導入的真正用途,感興趣的可以了解一下
    2026-04-04
  • Go sync WaitGroup使用深入理解

    Go sync WaitGroup使用深入理解

    這篇文章主要為大家介紹了Go sync WaitGroup使用深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Golang開發(fā)中常用的代碼片段匯總

    Golang開發(fā)中常用的代碼片段匯總

    這篇文章主要給大家匯總了在Golang開發(fā)中常用的代碼片段,這些代碼片段都是在日常工作中編寫golang應用時使用到,需要的朋友可以參考借鑒,下面跟著小編一起來學習學習吧。
    2017-07-07
  • Go多線程中數(shù)據(jù)不一致問題的解決方案(sync鎖機制)

    Go多線程中數(shù)據(jù)不一致問題的解決方案(sync鎖機制)

    在Go語言的并發(fā)編程中,如何確保多個goroutine安全地訪問共享資源是一個關鍵問題,Go語言提供了sync包,其中包含了多種同步原語,用于解決并發(fā)編程中的同步問題,本文將詳細介紹sync包中的鎖機制,需要的朋友可以參考下
    2024-10-10
  • golang優(yōu)先級隊列的實現(xiàn)全過程

    golang優(yōu)先級隊列的實現(xiàn)全過程

    優(yōu)先級隊列是一種特殊隊列,下面這篇文章主要給大家介紹了關于golang優(yōu)先級隊列的實現(xiàn)全過程,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • Go的slices.Grow優(yōu)雅擴容的實現(xiàn)

    Go的slices.Grow優(yōu)雅擴容的實現(xiàn)

    本文主要介紹了Go的slices.Grow優(yōu)雅擴容的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-06-06
  • golang 各種排序大比拼實例

    golang 各種排序大比拼實例

    這篇文章主要介紹了golang 各種排序大比拼實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言類型轉(zhuǎn)換工具庫cast的實現(xiàn)

    Go語言類型轉(zhuǎn)換工具庫cast的實現(xiàn)

    本文介紹了Go語言中的類型轉(zhuǎn)換工具庫cast,cast庫提供了一種簡單安全的方式來在各種類型間轉(zhuǎn)換,如ToIntSliceE、ToStringSliceE等,同時支持時間類型和時長類型的轉(zhuǎn)換,并能處理轉(zhuǎn)換失敗的情況,感興趣的可以了解一下
    2025-11-11
  • go性能分析工具pprof的用途及使用詳解

    go性能分析工具pprof的用途及使用詳解

    剛開始接觸go就遇到了一個內(nèi)存問題,在進行內(nèi)存分析的時候發(fā)現(xiàn)了一下比較好的工具,在此留下記錄,下面這篇文章主要給大家介紹了關于go性能分析工具pprof的用途及使用的相關資料,需要的朋友可以參考下
    2023-01-01
  • Go語言使用defer+recover解決panic導致程序崩潰的問題

    Go語言使用defer+recover解決panic導致程序崩潰的問題

    如果協(xié)程出現(xiàn)了panic,就會造成程序的崩潰,這時可以在goroutine中使用recover來捕獲panic,進行處理,本文就詳細的介紹一下,感興趣的可以了解一下
    2021-09-09

最新評論

柳州市| 雅安市| 九龙城区| 赞皇县| 大化| 侯马市| 都江堰市| 柞水县| 南充市| 青冈县| 汉中市| 嘉兴市| 嘉禾县| 湟源县| 邵阳市| 鹿泉市| 石台县| 都江堰市| 会昌县| 顺义区| 湖州市| 咸宁市| 牟定县| 绥化市| 陈巴尔虎旗| 剑阁县| 定州市| 龙泉市| 宣恩县| 宁都县| 镇江市| 鹿泉市| 临泽县| 丰原市| 禄丰县| 泸州市| 余江县| 萝北县| 岐山县| 营山县| 海兴县|