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