淺析Golang中make和new的用法區(qū)別
相同點(diǎn)
都是內(nèi)建函數(shù),都是在堆上分配內(nèi)存,都需要傳遞類型參數(shù)
不同點(diǎn)
1.傳遞的參數(shù)不一樣
new函數(shù)只接收一個(gè)參數(shù),make函數(shù)可以接收一個(gè)以上的參數(shù)
package main import "fmt" func main() { // int類型0值的指針,返回的值是以0x開頭的16進(jìn)制整數(shù),參數(shù)個(gè)數(shù)為1 intZeroValuePoint := new(int) fmt.Printf("%v\n", intZeroValuePoint) // 為slice分配內(nèi)存, 創(chuàng)建初始值問 [0 0 0 0 0] 的切片,參數(shù)個(gè)數(shù)為3,第三個(gè)參數(shù)是可選的 intHasInitLenSlice := make([]int, 5, 10) fmt.Printf("%v\n", intHasInitLenSlice) }
2.返回的參數(shù)類型不一樣
new函數(shù)返回對(duì)應(yīng)輸入?yún)?shù)類型的指針類型,make函數(shù)返回輸入?yún)?shù)類型
package main import "fmt" func main() { // int類型0值的指針,返回的值是以0x開頭的16進(jìn)制整數(shù) intZeroValuePoint := new(int) fmt.Printf("%T\n", intZeroValuePoint) // 輸出 *int // 為slice分配內(nèi)存, 創(chuàng)建初始值問 [0 0 0 0 0] 的切片 intHasInitLenSlice := make([]int, 5, 10) fmt.Printf("%T\n", intHasInitLenSlice) // 輸出 []int }
3.使用場(chǎng)景不一樣
new函數(shù)為類型分配類型對(duì)應(yīng)零值內(nèi)存并返回指針,make是為特定引用類型slice map chan 分配內(nèi)存
package main import "fmt" func main() { // int類型0值的指針,返回的值是以0x開頭的16進(jìn)制整數(shù) intZeroValuePoint := new(int) fmt.Printf("%T\n", intZeroValuePoint) // 輸出 *int // 為slice零值分配內(nèi)存,返回的值是以0x開頭的16進(jìn)制整數(shù) sliceZeroValuePoint := new([]int) fmt.Printf("%T: %v\n", sliceZeroValuePoint, sliceZeroValuePoint) // 輸出 *[]int &[] // 為slice分配內(nèi)存, 創(chuàng)建初始值問 [0 0 0 0 0] 的切片 intHasInitLenSlice := make([]int, 5, 10) fmt.Printf("%T\n", intHasInitLenSlice) // 輸出 []int // 為map分配內(nèi)存 mapValue := make(map[string]string, 10) fmt.Printf("%T\n", mapValue) // 輸出 map[string]string // 為chan類型分配內(nèi)存 chanValue := make(chan int, 10) fmt.Printf("%T\n", chanValue) }
總結(jié)
下面小編為大家總結(jié)了一下new和make函數(shù)的異同點(diǎn),希望對(duì)大家有所幫助
相同點(diǎn):
- 都是內(nèi)建函數(shù),用于內(nèi)存管理。
- 都涉及到動(dòng)態(tài)內(nèi)存的分配。
不同點(diǎn):
用途和適用類型:
- new(T):適用于任何類型的內(nèi)存分配,包括但不限于結(jié)構(gòu)體、數(shù)組、指針等。它會(huì)為指定的類型 T 分配內(nèi)存,并將內(nèi)存初始化為其零值,然后返回指向該內(nèi)存區(qū)域的指針(類型為 *T)。
- make(T, args…):僅適用于三個(gè)內(nèi)建的引用類型,即切片(slice)、映射(map)和通道(channel)。對(duì)于這三種類型,make 不僅僅是分配內(nèi)存,還會(huì)執(zhí)行額外的初始化操作,如設(shè)置內(nèi)部數(shù)據(jù)結(jié)構(gòu)、哈希表大小以及 channel 緩沖區(qū)等。make 函數(shù)的返回值直接是初始化后的 slice/map/channel 類型,而不是指針。
使用方式和返回值:
- new() 的調(diào)用形式相對(duì)簡(jiǎn)單:p := new(Type),返回的是一個(gè)指向新分配內(nèi)存的指針。
- make() 的調(diào)用需要提供額外參數(shù)以初始化相應(yīng)的類型,例如創(chuàng)建切片時(shí)需要長(zhǎng)度和可選的容量:s := make([]int, length, capacity);創(chuàng)建 map 或 channel 時(shí)無需指定大小,但可以對(duì)通道指定緩沖區(qū)大小。
初始化內(nèi)容:
new() 只做最基本的內(nèi)存分配并填充零值。
make() 初始化的內(nèi)容更復(fù)雜,例如:
- 對(duì)于切片,會(huì)創(chuàng)建底層數(shù)組并設(shè)置長(zhǎng)度和容量;
- 對(duì)于映射,會(huì)初始化一個(gè)空的哈希表;
- 對(duì)于通道,會(huì)創(chuàng)建一個(gè)通信的數(shù)據(jù)結(jié)構(gòu),并可選擇性地分配緩沖區(qū)。
到此這篇關(guān)于淺析Golang中make和new的用法區(qū)別的文章就介紹到這了,更多相關(guān)Go make new區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go內(nèi)存緩存BigCache實(shí)現(xiàn)BytesQueue源碼解讀
這篇文章主要為大家介紹了go內(nèi)存緩存BigCache實(shí)現(xiàn)BytesQueue源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Golang中crypto/cipher加密標(biāo)準(zhǔn)庫全面指南
本文主要介紹了Golang中crypto/cipher加密標(biāo)準(zhǔn)庫,包括對(duì)稱加密、非對(duì)稱加密以及使用流加密和塊加密算法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02詳解golang channel有無緩沖區(qū)的區(qū)別
這篇文章主要給大家介紹了golang channel有無緩沖區(qū)的區(qū)別,無緩沖是同步的,有緩沖是異步的,文中通過代碼示例給大家講解的非常詳細(xì),需要的朋友可以參考下2024-01-01