在学习 Go语言 的过程中,很多初学者都会对两个内置函数 new 和 make 感到困惑。它们看起来都用于“创建”某些东西,但实际用途却大不相同。本文将用通俗易懂的方式,详细讲解 Go语言 new和make区别,帮助你彻底掌握这两个关键的内存分配工具。
new 是 Go 语言中用于分配内存的内置函数。它的作用是为任意类型分配一块已清零的内存,并返回指向该内存的指针。
语法如下:
ptr := new(Type) 例如:
package mainimport "fmt"func main() { p := new(int) // 分配一个int类型的零值内存(即0),并返回*int fmt.Println(*p) // 输出: 0 fmt.Printf("%T\n", p) // 输出: *int} 注意:new 返回的是指针,且分配的内存被初始化为该类型的零值(zero value)。
make 也是 Go 的内置函数,但它只能用于 slice、map 和 channel 这三种引用类型。它的作用不仅是分配内存,还会进行初始化,使其处于可用状态。
语法如下:
slice := make([]Type, length, capacity)mapVar := make(map[KeyType]ValueType)ch := make(chan Type, buffer) 例如:
package mainimport "fmt"func main() { s := make([]int, 3, 5) // 创建长度为3、容量为5的切片 m := make(map[string]int) // 创建一个空的map ch := make(chan int, 2) // 创建带缓冲的channel fmt.Println(s) // [0 0 0] fmt.Println(m) // map[] fmt.Printf("%T\n", s) // []int} 关键点:make 返回的是类型本身(不是指针),并且会完成必要的内部结构初始化(比如 map 的哈希表、slice 的底层数组等)。
| 特性 | new | make |
|---|---|---|
| 适用类型 | 任意类型 | 仅 slice、map、channel |
| 返回值 | 指针(*T) | 类型本身(T) |
| 是否初始化 | 设置为零值 | 完全初始化(可直接使用) |
❌ 错误用法:试图用 new 创建 map 或 slice 并直接使用:
m := new(map[string]int)(*m)["key"] = 1 // panic! 因为 map 未初始化 ✅ 正确做法:使用 make 初始化引用类型:
m := make(map[string]int)m["key"] = 1 // 正常工作 因此,在 Go 开发中:
new(但更推荐使用 &Type{} 语法)make 来创建可用实例理解 Go内置函数new 与 Go内置函数make 的底层差异,是掌握 Go 内存管理的关键一步。记住:new 分配零值内存并返回指针,make 初始化引用类型并返回值本身。合理使用它们,能让你的 Go 程序更安全、高效。
希望这篇关于 Go内存分配 的教程能帮你扫清疑惑!如果你觉得有用,欢迎分享给其他 Go 初学者。
本文由主机测评网于2025-12-08发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124765.html