三年Golang碼農(nóng),竟然不知道New和Make有什么區(qū)別?
在 Go 語言中,new 和 make 是兩個用于內(nèi)存分配的內(nèi)置函數(shù),但它們有不同的用途和行為。理解它們之間的區(qū)別對于正確地使用 Go 語言的內(nèi)存管理至關(guān)重要。
new 和 make 的區(qū)別
- new 函數(shù):
用途:new 用于為變量分配內(nèi)存,并返回指向該內(nèi)存的指針。
返回值:new 返回的是一個指向類型的指針,且該內(nèi)存區(qū)域會被初始化為零值(例如整數(shù)為 0,布爾為 false,指針為 nil)。
適用類型:可以用于所有類型,包括基本類型(如 int、float 等)和復(fù)合類型(如 struct、數(shù)組等)。
語法:new(T),其中 T 是要分配的類型。
- make 函數(shù):
用途:make 用于為特定類型的數(shù)據(jù)結(jié)構(gòu)分配和初始化內(nèi)存,這些類型包括切片(slice)、映射(map)和信道(channel)。
返回值:make 返回初始化后的值,而不是指針。
適用類型:只能用于切片、映射和信道,不能用于其他類型。
語法:make(T, size),其中 T 是要分配的類型,size 是指定的大?。▽τ谟成浜托诺朗侨萘浚?。
代碼實(shí)例
使用 new
package main
import "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
// 修改結(jié)構(gòu)體中的字段
p.Name = "Alice"
p.Age = 30
fmt.Println(*p) // 輸出:{Alice 30}
}
使用 make
package main
import "fmt"
func main() {
// 使用 make 分配一個切片
slice := make([]int, 5) // 創(chuàng)建一個長度為 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) // 創(chuàng)建一個容量為 2 的緩沖信道
ch <- 1
ch <- 2
fmt.Println(<-ch) // 輸出:1
fmt.Println(<-ch) // 輸出:2
}
總結(jié)
- new:用于分配內(nèi)存并返回指針。適用于所有類型。分配的內(nèi)存會被初始化為類型的零值。
- make:用于初始化切片、映射和信道,返回的是初始化后的類型,而不是指針。make 不會返回指針,因?yàn)樗祷氐氖且呀?jīng)初始化好的數(shù)據(jù)結(jié)構(gòu)。
正確理解和使用 new 和 make,可以更好地管理 Go 語言中的內(nèi)存分配和數(shù)據(jù)結(jié)構(gòu)初始化。