淺析Golang中make和new的用法區(qū)別
相同點
都是內建函數(shù),都是在堆上分配內存,都需要傳遞類型參數(shù)
不同點
1.傳遞的參數(shù)不一樣
new函數(shù)只接收一個參數(shù),make函數(shù)可以接收一個以上的參數(shù)
package main
import "fmt"
func main() {
// int類型0值的指針,返回的值是以0x開頭的16進制整數(shù),參數(shù)個數(shù)為1
intZeroValuePoint := new(int)
fmt.Printf("%v\n", intZeroValuePoint)
// 為slice分配內存, 創(chuàng)建初始值問 [0 0 0 0 0] 的切片,參數(shù)個數(shù)為3,第三個參數(shù)是可選的
intHasInitLenSlice := make([]int, 5, 10)
fmt.Printf("%v\n", intHasInitLenSlice)
}
2.返回的參數(shù)類型不一樣
new函數(shù)返回對應輸入?yún)?shù)類型的指針類型,make函數(shù)返回輸入?yún)?shù)類型
package main
import "fmt"
func main() {
// int類型0值的指針,返回的值是以0x開頭的16進制整數(shù)
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函數(shù)為類型分配類型對應零值內存并返回指針,make是為特定引用類型slice map chan 分配內存
package main
import "fmt"
func main() {
// int類型0值的指針,返回的值是以0x開頭的16進制整數(shù)
intZeroValuePoint := new(int)
fmt.Printf("%T\n", intZeroValuePoint) // 輸出 *int
// 為slice零值分配內存,返回的值是以0x開頭的16進制整數(shù)
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函數(shù)的異同點,希望對大家有所幫助
相同點:
- 都是內建函數(shù),用于內存管理。
- 都涉及到動態(tài)內存的分配。
不同點:
用途和適用類型:
- new(T):適用于任何類型的內存分配,包括但不限于結構體、數(shù)組、指針等。它會為指定的類型 T 分配內存,并將內存初始化為其零值,然后返回指向該內存區(qū)域的指針(類型為 *T)。
- make(T, args…):僅適用于三個內建的引用類型,即切片(slice)、映射(map)和通道(channel)。對于這三種類型,make 不僅僅是分配內存,還會執(zhí)行額外的初始化操作,如設置內部數(shù)據(jù)結構、哈希表大小以及 channel 緩沖區(qū)等。make 函數(shù)的返回值直接是初始化后的 slice/map/channel 類型,而不是指針。
使用方式和返回值:
- new() 的調用形式相對簡單:p := new(Type),返回的是一個指向新分配內存的指針。
- make() 的調用需要提供額外參數(shù)以初始化相應的類型,例如創(chuàng)建切片時需要長度和可選的容量:s := make([]int, length, capacity);創(chuàng)建 map 或 channel 時無需指定大小,但可以對通道指定緩沖區(qū)大小。
初始化內容:
new() 只做最基本的內存分配并填充零值。
make() 初始化的內容更復雜,例如:
- 對于切片,會創(chuàng)建底層數(shù)組并設置長度和容量;
- 對于映射,會初始化一個空的哈希表;
- 對于通道,會創(chuàng)建一個通信的數(shù)據(jù)結構,并可選擇性地分配緩沖區(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

