在 Go 語言中,new 和 make 是兩個用于內存分配的內置函數,但它們有不同的用途和行為。理解它們之間的區別對于正確地使用 Go 語言的內存管理至關重要。
用途:new 用于為變量分配內存,并返回指向該內存的指針。
返回值:new 返回的是一個指向類型的指針,且該內存區域會被初始化為零值(例如整數為 0,布爾為 false,指針為 nil)。
適用類型:可以用于所有類型,包括基本類型(如 int、float 等)和復合類型(如 struct、數組等)。
語法:new(T),其中 T 是要分配的類型。
用途:make 用于為特定類型的數據結構分配和初始化內存,這些類型包括切片(slice)、映射(map)和信道(channel)。
返回值:make 返回初始化后的值,而不是指針。
適用類型:只能用于切片、映射和信道,不能用于其他類型。
語法:make(T, size),其中 T 是要分配的類型,size 是指定的大小(對于映射和信道是容量)。
package mainimport "fmt"func main() { // 使用 new 分配一個 int 類型的指針 ptr := new(int) fmt.Println(ptr) // 輸出指針地址,例如:0xc000016088 fmt.Println(*ptr) // 輸出零值:0 // 將指針指向的值修改為 100 *ptr = 100 fmt.Println(*ptr) // 輸出:100 // 使用 new 分配一個 struct 的指針 type Person struct { Name string Age int } p := new(Person) fmt.Println(p) // 輸出:&{ 0},零值初始化 fmt.Println(p.Name) // 輸出:""(空字符串) fmt.Println(p.Age) // 輸出:0 // 修改結構體中的字段 p.Name = "Alice" p.Age = 30 fmt.Println(*p) // 輸出:{Alice 30}}
package mainimport "fmt"func main() { // 使用 make 分配一個切片 slice := make([]int, 5) // 創建一個長度為 5 的切片,初始值為 0 fmt.Println(slice) // 輸出:[0 0 0 0 0] slice[0] = 10 fmt.Println(slice) // 輸出:[10 0 0 0 0] // 使用 make 分配一個映射 myMap := make(map[string]int) myMap["key1"] = 100 fmt.Println(myMap) // 輸出:map[key1:100] // 使用 make 分配一個信道 ch := make(chan int, 2) // 創建一個容量為 2 的緩沖信道 ch <- 1 ch <- 2 fmt.Println(<-ch) // 輸出:1 fmt.Println(<-ch) // 輸出:2}
正確理解和使用 new 和 make,可以更好地管理 Go 語言中的內存分配和數據結構初始化。
本文鏈接:http://www.tebozhan.com/showinfo-26-112700-0.html三年Golang碼農,竟然不知道New和Make有什么區別?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com