Go 中 make 與 new:區(qū)別及優(yōu)秀實踐
作者:孔令飛
Go 中 make 與 new 雖均可分配內(nèi)存,但定位和使用場景截然不同。正確區(qū)分并合理使用,有助于編寫高效且易維護(hù)的代碼。
Go 提供兩種常用的內(nèi)存分配方式:make 與 new。二者雖均可分配內(nèi)存,但定位和使用場景截然不同。正確區(qū)分并合理使用,有助于編寫高效且易維護(hù)的代碼。

new:分配并返回類型指針
new功能如下:
- 為任意類型分配零值內(nèi)存;
- 返回指向該內(nèi)存的指針。
示例:
p := new(int)
fmt.Println(*p) // 0特點(diǎn):
- 返回值:*T(類型指針);
- 初始化:自動填充零值;
- 適用范圍:所有類型,常用于結(jié)構(gòu)體或基礎(chǔ)類型。
make:初始化切片、映射和通道
make 功能如下:
- 專用于內(nèi)置引用類型:切片、映射和通道;
- 分配底層數(shù)據(jù)結(jié)構(gòu)并完成必要初始化。
示例:
// 切片
s := make([]int, 5) // 長度 5,容量 5
// 映射
m := make(map[string]int, 10) // 初始容量 10
// 緩沖通道
ch := make(chan int, 2)特點(diǎn):
- 返回值:對象本身(而非指針)。
- 初始化:完成長度、容量或緩沖區(qū)設(shè)置。
- 適用范圍:僅限切片、映射、通道。
差異對比
維度 | new | make |
目的 | 分配零值內(nèi)存 | 初始化切片、映射、通道 |
返回值 | 指針 *T | 對象本身 |
適用類型 | 所有類型 | 切片、映射、通道 |
初始化行為 | 填充零值 | 構(gòu)建底層數(shù)據(jù)結(jié)構(gòu)并設(shè)定容量/緩沖區(qū) |
使用建議
何時使用 new:
- 創(chuàng)建結(jié)構(gòu)體或基本類型指針,且無需自定義初始化邏輯。
- 需要持有可變對象的指針以便在多處共享。
type Person struct{ Name string; Age int }
p := new(Person) // &{"" 0}何時使用 make:
- 創(chuàng)建并初始化切片、映射或通道,尤其需指定容量或緩沖區(qū)時。
s := make([]int, 0, 64) // 預(yù)分配容量
m := make(map[string]int, 32)
ch := make(chan struct{}, 4)性能考量
- new 僅做零值填充,開銷最小。
- make 同時分配并初始化底層結(jié)構(gòu);為切片、映射預(yù)設(shè)合適容量,可減少后續(xù)擴(kuò)容成本。
- 對切片、映射、通道使用 new 只會得到 nil 引用,訪問時將導(dǎo)致運(yùn)行時錯誤。
常見誤用示例
// 誤用:僅分配指針,未初始化映射
m := new(map[string]int)
(*m)["age"] = 30 // panic: assignment to entry in nil map
// 正確做法
m := make(map[string]int)
m["age"] = 30小結(jié)
- new:面向所有類型,返回指針,自動零值初始化。
- make:面向切片、映射和通道,返回已初始化的對象,并可指定容量或緩沖區(qū)。
熟練掌握二者差異并依據(jù)場景選擇,可有效提高 Go 代碼的性能與可維護(hù)性。
責(zé)任編輯:趙寧寧
來源:
令飛編程

































