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)"


相关推荐
程序猿DD18 小时前
OctaFuse Gateway 2.17.0:新增维护模式、请求日志汇总、DashScope 语音路由拆分
后端
quantdash_cc18 小时前
如何检查滚动收益率计算中的窗口长度不足?——从数学定义到 Pandas 实现
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
陈随易18 小时前
副业搞钱点子之赛事与活动
前端·后端·程序员
衍生星球19 小时前
【Java 语言】— 方法(方法定义、调用、参数、返回值、方法重载)
java·开发语言·方法
Profile排查笔记19 小时前
有哪些开源指纹浏览器项目?先核对客户端、内核与许可证
前端·人工智能·后端·自动化
CodeGL19 小时前
16、Python Web开发
开发语言·前端·python
鶴哥只手遮天19 小时前
雷达系统与成像仿真:从电磁散射到工程实现-第 1 章 雷达系统的分层架构与指标闭环
后端
喵了几个咪19 小时前
GoWind UBA 拆解:把 Doris UNIQUE KEY 翻译成 ClickHouse——读数正确性对齐实录
开发语言·后端·clickhouse·微服务·golang·gowind
王中阳Go19 小时前
面试官问什么,取决于你简历上写了什么:后端转 Agent 岗的项目准备法
后端·面试·agent
FRing0319 小时前
JavaScript入门到精通二十九(内置构造函数(Object、Array))
开发语言·前端·javascript