Golang中make()和new()的区别与作用?

前言

Go语言中,make()和new()的区别与作用?

✅ 一句话总结区别

new:只分配内存,返回指针,不初始化 → 零值对象
make:分配 + 初始化,返回"可用的"引用类型对象 → slice/map/channel 才能用 make


make 的作用

make 只能用于以下 3 种类型:

  1. slice(切片)
  2. map(字典/哈希表)
  3. channel(通道)

这三种类型都属于 引用类型 ,需要底层结构的初始化,因此必须用 make 构造它们的内部数据结构。


📌 1. slice

go 复制代码
s := make([]int, 5)          // 长度 5,容量 5
s2 := make([]int, 0, 10)     // 长度 0,容量 10

📌 2. map

go 复制代码
m := make(map[string]int)        // 空 map
m2 := make(map[string]int, 10)   // 预分配 bucket

注意:未初始化的 map 是 nil ,不能直接赋值。


📌 3. channel

go 复制代码
ch := make(chan int)      // 无缓冲通道
ch2 := make(chan int, 5)  // 带缓冲通道

🚫 make 不能用来创建

✔ 数组(array)

✔ 结构体(struct)

✔ 指针(pointer)

✔ 接口(interface)

✔ 函数(func)

这些类型要用:

  • 字面量([]T{}, map[K]V{}
  • new(T)
  • 或直接 var x T

🎯 一句话记住:

make 只做三件事:初始化 slice、map、channel 的内部数据结构。


new 的作用(基础类型通用)

✔ 功能:

  • 分配内存
  • 返回一个指向零值的指针(如 *int*T
  • 不初始化内部结构

✔ 适用:

  • 任意类型(int、struct、array、map、slice... 都能用 new,但不一定有用)

✔ 示例:

go 复制代码
i := new(int)
fmt.Println(*i)  // 0(零值)

type User struct {
    Name string
}
u := new(User)
fmt.Println(u.Name)  // "" 零值

❌ 但 new 出来的 slice/map/channel 是不能直接用的!(重要)

go 复制代码
m := new(map[string]int)
(*m)["a"] = 1  // ❌ panic: assignment to entry in nil map

为什么?因为 map 需要"内部结构",new 并没有初始化它。


⭐ 最重要对比(核心知识点)

功能 make new
用于类型 slice / map / channel 所有类型
返回类型 引用类型本身(如 []int, map[...]... 指针(如 *int, *User
是否初始化内部结构 ✔ 是 ✘ 否
是否能直接使用 ✔ 是 ❌ 通常不能
是否用于构造对象 部分引用类型 任意类型,但仅分配零值

⭐ 典型示例:slice / map 的 make vs new

❌ new 创建不可用 map

go 复制代码
m := new(map[string]int)
(*m)["hello"] = 1   // panic:nil map

✔ make 创建可用 map

go 复制代码
m := make(map[string]int)
m["hello"] = 1   // OK

❌ new 创建的 slice 也不可直接 append

go 复制代码
s := new([]int)
*s = append(*s, 1) // panic: nil slice

✔ make 创建 slice 可直接使用

go 复制代码
s := make([]int, 0, 5)
s = append(s, 1)
fmt.Println(s)  // [1]

🎯 终极记忆法(非常好用)

new(T) → "我要一个 T 类型的 指针 给我,但内容不要初始化"

make(T) → "我要一个能立即使用的 T(仅限 slice/map/channel)"


相关推荐
星火开发设计10 小时前
C++ 数组:一维数组的定义、遍历与常见操作
java·开发语言·数据结构·c++·学习·数组·知识
TTGGGFF10 小时前
控制系统建模仿真(一):掌握控制系统设计的 MAD 流程与 MATLAB 基础运算
开发语言·matlab
2501_9444241210 小时前
Flutter for OpenHarmony游戏集合App实战之贪吃蛇食物生成
android·开发语言·flutter·游戏·harmonyos
Lhuu(重开版11 小时前
JS:正则表达式和作用域
开发语言·javascript·正则表达式
仙俊红12 小时前
Java Map 家族核心解析
java·开发语言
浅念-12 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
pumpkin8451413 小时前
01 Coze Studio项目中所有关键术语的详细解释和代码示例
golang
code_li13 小时前
聊聊支付宝架构
java·开发语言·架构
少控科技13 小时前
QT高阶日记01
开发语言·qt
无限进步_14 小时前
【C++】大数相加算法详解:从字符串加法到内存布局的思考
开发语言·c++·windows·git·算法·github·visual studio