当前位置: 首页 > news >正文

Go语言中为什么map、slice、channel需要var之后还要make一下?

在 Go 语言中,当你声明的变量是某些复合类型(map、slice、channel)时,var 定义后仍需要 make() 初始化,否则就是 nil,一用就会 panic。
🧠 哪些类型需要 make()?

类型是否需要 make() 初始化为什么
map✅ 需要var 只声明,不能用;必须 make() 才能用
slice✅ 通常需要否则是 nil,不能 append
chan✅ 必须nil channel 发送/接收会阻塞或 panic
array❌ 不需要是值类型,直接可用
struct❌ 不需要是值类型,直接可用
interface❌ 不需要是引用类型,直接赋值即可
pointer❌(用 new()&new(T)&T{} 创建指针即可
  1. map 示例:
var m map[string]int   // ✅ m is nil
m["a"] = 1              // ❌ panic: assignment to entry in nil map
// 正确用法:
m = make(map[string]int)
m["a"] = 1              // ✅ OK
  1. slice 示例:
var s []int            // ✅ s is nil
s = append(s, 1)       // ✅ OK:append 会自动分配底层数组
s[0] = 2               // ✅ OK:可以修改
len(s)                 // ✅ OK:为 1//但如果要提前分配内存/容量,更高效:
s := make([]int, 0, 10)  // 分配容量为10,长度为0
  1. chan 示例:
var ch chan int        // ✅ ch is nilch <- 1                // ❌ panic: send on nil channel// 正确用法:
ch = make(chan int)
go func() { ch <- 1 }()
// 或带缓冲区:
ch = make(chan int, 10)

map、slice、chan 用 var 声明后仍是 nil,想用必须 make(),否则 panic。
记住一句话就够了:
“var 声明指针结构,make 才能真正构造。”

疑问?为什么需要make一下?

✅ 本质答案:因为它们是 引用类型,make() 是为了分配底层内存并初始化运行时结构。
🔍 拆解解释:
make() 是干嘛的?
make() 是 为 Go 的内建引用类型分配和初始化底层数据结构。它返回的是 已初始化的引用类型值,可直接使用。

📦 这些类型有什么特别的?

make() 针对的是:map、slice、chan

类型是否值类型?是否需要底层结构支持是否需要 make?说明
map引用类型是(哈希表)✅ 是必须初始化哈希桶等内部结构
slice引用类型是(数组 + 元数据)✅ 一般需要内部有指针、长度、容量结构
chan引用类型是(带缓冲/无缓冲队列)✅ 是必须初始化缓冲区和通信机制
array值类型❌ 不需要❌ 不需要直接分配,零值即可用
struct值类型❌ 不需要❌ 不需要自动分配零值字段
pointer引用类型❌ 不需要❌ 用 new()new(T) 返回 *T,不分配复杂结构

✅ 总结:
Go 中的 map、slice、chan 是引用类型,var 声明后只是 nil,还不能用。必须 make() 来初始化它们的底层结构(如哈希表、数组、缓冲区等)。

“声明只是承诺,make 才是动工。”

http://www.xdnf.cn/news/606907.html

相关文章:

  • FTP Bounce Attack:原理、影响与防御
  • 如何安装和维护 Linux 系统?
  • 2025电工杯数学建模竞赛B题 城市垃圾分类运输的路径优化与调度 保姆级教程讲解|模型讲解
  • Missashe线代题型总结
  • 编译器ar命令参数
  • java中多线程的实现方式
  • 【算法篇】二分查找算法:基础篇
  • AES加密模式详解及OpenSSL C库函数指南
  • 【SSL部署与优化​】​​OCSP Stapling配置指南:减少证书验证延迟​​
  • 相机坐标系、图像坐标系和世界坐标系
  • redis 基本命令-17 (KEYS、EXISTS、TYPE、TTL)
  • 新手SEO高效入门实战精要
  • 40 岁 Windows 开启 AI 转型:从系统到生态的智能重构
  • 「MATLAB」计算校验和 Checksum
  • C++:动态刷新打印内容
  • 使用Gemini, LangChain, Gradio打造一个书籍推荐系统 (第二部分)
  • 【Elasticsearch】给所索引创建多个别名
  • 【Bluedroid】蓝牙HID Host disconnect流程源码解析
  • UE4游戏查找本地角色数据的方法-SDK
  • 从零开始的抽奖系统创作(4)
  • FPGA 42 ,时序约束深度解析与实战应用指南( FPGA 时序约束 )
  • 分享|16个含源码和数据集的计算机视觉实战项目
  • VMware虚拟机突然无法ssh连接
  • Spring Boot WebFlux流式返回全攻略:从基础到企业级实践
  • PHP7内核剖析 学习笔记 第八章 命名空间
  • Python打卡DAY34
  • 亚马逊搜索代理: 终极指南
  • 线性回归中涉及的数学基础
  • 嵌入式学习笔记 - freeRTOS链表中pxIndex->pxPrevious 与pxIndex->pxPrevious->的区别
  • DB-GPT扩展自定义Agent配置说明