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


相关推荐
微学AI5 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
豆瓣鸡6 小时前
算法日记 - Day3
java·开发语言·算法
mldong6 小时前
从 mldong 到 jeeflow:一个工作流引擎的独立进化
后端
Achou.Wang6 小时前
深入理解go语言-第5章 并发编程——Go的灵魂
大数据·算法·golang
韭菜炒鸡肝天6 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
陈随易6 小时前
MoonBit抓包模块pcap,查看电脑的每一次联网通信
前端·后端·程序员
Aaron - Wistron7 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
卷无止境7 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境7 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
Dxy12393102168 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python