当前位置: 首页 > 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 才是动工。”

相关文章:

  • Excel多合一文件合并工具
  • QGIS如何打开 ARCGIS的mxd工程文件
  • 怎么判断一个Android APP使用了React Native 这个跨端框架
  • ArcGIS Pro对图斑进行等比例、等面积、等宽度的分割
  • vue 中的v-once
  • 集群、容器云与裸金属服务器的全面对比分析
  • 图形推理_
  • [数据集]无人机视角检测分割数据集合集
  • 【新品来袭】功耗降低56%爱普生研发新款晶体振荡器
  • 京东外卖分润系统部署实操!0门槛入驻+全平台接入+自定义比例...这些人,赚翻了!
  • (万字长文)Django数据库操作——ORM:数据交互显示前端网页
  • OPC Client第5讲(wxwidgets):初始界面的事件处理;按照配置文件初始化界面的内容
  • 07_分类器不确定评估
  • 「短剧系统开发」定制化技术架构|高并发微服务 + AI 推荐,快速搭建流量级短剧平台
  • JMeter-SSE响应数据自动化
  • SpringBoot-10-SpringBoot结合MyBatis操作mysql并提供web服务
  • 李宏毅《深度学习》:Self-attention 自注意力机制
  • [Datagear] 实现按月颗粒度选择日期的方案
  • 目前,Navicat 17.1 版本的用户管理功能无法使用,如何回退到上一个版本?关于之前提到的转置功能?
  • WebSphere Application Server(WAS)8.5.5教程第十二讲:EJB
  • 网站搭建教程零基础/全网营销与seo
  • 涪城移动网站建设/深圳关键词优化软件
  • 企业网站托管有必要吗/网站竞价推广怎么做
  • 如何建一个公司的网站/网页版登录入口
  • 沈阳网站开发简维/黑龙江头条今日新闻
  • 用返利网站做爆款/免费下载百度软件