# Go 语言中 make 和 new 的区别 🔍
在 Go 语言中, make
和 new
都是用于内存分配的内建函数,但它们的使用场景和行为有着明显的区别。让我们深入了解这两个函数的特点和应用! 💡
# new 函数详解 🎯
new
函数主要用于值类型的内存分配,如 int
、 float
、 struct
等。它的特点是:
func new(Type) *Type | |
// 使用示例 | |
ptr := new(int) //ptr 的类型是 *int | |
*ptr = 100 // 通过指针设置值 | |
fmt.Println(*ptr) // 输出: 100 |
# new 的关键特性:
- 返回类型是指针 👉
- 自动将内存置为零值 ✨
- 常用于基本数据类型和结构体 🏗️
# make 函数详解 🛠️
make
函数专门用于引用类型的内存分配,包括 slice
、 map
和 channel
。它的函数签名是:
func make(t Type, size ...IntegerType) Type | |
// 使用示例 | |
slice := make([]int, 3, 5) // 创建长度为 3,容量为 5 的切片 | |
m := make(map[string]int) // 创建 map | |
ch := make(chan int, 2) // 创建带缓冲的 channel |
# make 的关键特性:
- 返回的是类型本身,而非指针 🎯
- 会进行必要的初始化 ⚙️
- 可以指定容量或长度等参数 📏
# make 和 new 的核心区别 🔥
创建目的不同
new
: 为值类型分配内存 💫make
: 为引用类型分配并初始化内存 🌟
返回类型不同
new
: 返回指向零值的指针 👆make
: 返回初始化后的实例 ✨
初始化行为不同
new
: 仅分配内存并置零 🆕make
: 分配内存并执行必要的初始化 🔄
适用类型不同
new
: 可用于任何类型 🎯make
: 仅用于 slice、map、channel 📦
# 实际应用示例 💻
// 使用 new | |
type Person struct { | |
Name string | |
Age int | |
} | |
p := new(Person) //p 是 *Person 类型 | |
p.Name = "张三" // 可以直接使用点号访问字段 | |
// 使用 make | |
s := make([]int, 3) // 创建切片 | |
m := make(map[string]int) // 创建 map | |
ch := make(chan int) // 创建 channel |
# 使用建议 💡
- 需要指针时,使用
new
- 创建切片、映射或通道时,使用
make
- 记住:
new
分配内存,make
分配并初始化 ✨
希望这篇文章帮助你更好地理解 Go 语言中 make
和 new
的区别!加油! 🚀