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

Go语言:一文学搞懂核心函数“make”

在 Go 语言中,make 是一个特殊的内置函数,主要用于初始化引用类型的数据结构,为其分配内存并设置初始状态。它与 new 函数不同(new 仅分配内存并返回指针,不初始化),make 会根据类型进行特定的初始化,使其可以直接使用。

make 的使用场景

make 仅用于三种内置引用类型:

  • 切片(slice)
  • 映射(map)
  • 通道(channel)

它的语法格式为:

make(类型, 长度, 容量)  // 切片专用,容量可选
make(类型, 长度)        // 映射/通道,长度对不同类型含义不同

1. 初始化切片(slice)

切片是对数组的动态封装,make 用于创建切片时,需要指定类型长度(len) 和可选的容量(cap)

  • 长度(len):切片当前可访问的元素个数(初始值为零值,如 0""nil 等)。
  • 容量(cap):切片底层数组的大小,必须 ≥ 长度(默认等于长度)。

示例

// 创建一个长度为 3、容量为 5 的 int 切片
s := make([]int, 3, 5)
fmt.Println(len(s)) // 输出:3(可访问 3 个元素)
fmt.Println(cap(s)) // 输出:5(底层数组可容纳 5 个元素)
fmt.Println(s)      // 输出:[0 0 0](初始值为 int 的零值 0)// 省略容量时,容量 = 长度
s2 := make([]string, 2)
fmt.Println(len(s2), cap(s2)) // 输出:2 2

注意:切片的底层数组会在容量不足时自动扩容,make 预先指定合适的容量可以减少扩容次数,提高性能。

2. 初始化映射(map)

映射是键值对集合,make 用于创建映射时,需要指定类型和可选的初始容量(预估键值对数量)

  • 初始容量:提前分配的内存空间,用于优化性能(避免频繁扩容),但映射的实际长度(len)初始为 0,会随键值对的添加而增长。
  • 若不指定容量,Go 会默认分配一个小的初始空间。

示例

// 创建一个初始容量为 10 的 string->int 映射
m := make(map[string]int, 10)
fmt.Println(len(m)) // 输出:0(初始无键值对)// 向映射添加元素
m["a"] = 1
fmt.Println(len(m)) // 输出:1// 省略容量,使用默认值
m2 := make(map[int]string)

注意:映射必须通过 make 或字面量初始化后才能使用,直接声明未初始化的映射(如 var m map[string]int)是 nil,无法添加元素(会 panic)。

3. 初始化通道(channel)

通道是用于 goroutine 间通信的管道,make 用于创建通道时,需要指定类型和可选的缓冲区大小

  • 无缓冲通道:缓冲区大小为 0,发送和接收操作必须同步(一方阻塞直到另一方准备好)。
  • 有缓冲通道:指定缓冲区大小(n),可暂存 n 个元素,发送操作在缓冲区满时阻塞,接收操作在缓冲区空时阻塞。

示例

// 创建一个无缓冲的 int 通道(缓冲区大小 0)
ch1 := make(chan int)
// 创建一个缓冲区大小为 5 的 string 通道
ch2 := make(chan string, 5)fmt.Println(cap(ch1)) // 输出:0(无缓冲)
fmt.Println(cap(ch2)) // 输出:5(缓冲区大小)

注意:通道必须通过 make 初始化后才能使用,未初始化的通道(var ch chan int)是 nil,发送/接收操作会永久阻塞。

makenew 的区别

特性makenew
作用对象仅用于 slice、map、channel可用于任意类型
返回值类型本身(已初始化的引用类型)指向类型的指针(*T,值为零值)
初始化行为分配内存并初始化(设置初始状态)仅分配内存,值为零值(不初始化结构)

示例对比

// new 用于切片:返回 *[]int,指向零值切片(nil)
sPtr := new([]int)
fmt.Println(*sPtr == nil) // 输出:true(未初始化,无法使用)// make 用于切片:返回 []int,已初始化
s := make([]int, 3)
fmt.Println(s == nil) // 输出:false(可直接使用)

总结

make 是 Go 中初始化引用类型(slice、map、channel)的专用函数,它不仅分配内存,还会根据类型进行必要的初始化(如设置长度、容量、缓冲区等),确保这些类型可以直接使用。理解 make 的参数含义(长度、容量、缓冲区)对优化性能和避免错误(如操作 nil 映射/通道)非常重要。

http://www.dtcms.com/a/512135.html

相关文章:

  • 什么网站是教做纸工的测量为什么要建站
  • 徐州专业做网站的提高自己网站
  • FFmpeg--FlvPaser源码解析
  • html+js 实现生活缴费页面模板
  • Linux小课堂: 定时与延时执行机制之date、at、sleep 与 crontab 的深度解析
  • Linux第二弹
  • 【VSCode中git管理工具】无法初始化仓库
  • 二手房网站建设自己学习建设网站
  • 网站模板找超速云建站自动化毕设题目网站开发
  • Web原生架构如何优化数据库权限管理:简化操作与增强安全性
  • HashMap扩容过程是什么?怎么解决哈希冲突?
  • OpenSSH 安全配置核心概念解析
  • TCL华星t8项目正式开工,总投资额约295亿元
  • 营销网站制作信ls15227微信网站建设公司首选
  • 新手指南:如何在悟空AI CRM中创建和管理客户
  • 网站建设來选宙斯站长网站建设运营合同范本
  • 新能源汽车的“隐形守护者”:深度解析车载充电机(OBC)的关键作用
  • AAIA:从 “普通审计” 到 “AI 专家” 的跃迁
  • 【系统分析师】核心考点:100个高频知识点汇总
  • 基于单片机的机房环境监测系统设计与实现
  • 做网站的每天打电话咋办深圳 微网站
  • 网站建设视屏电子商务网站开发工具
  • 2.常见软件测试分类的串联
  • Gemini CLI接入CloudBase-AI-Toolkit(MCP)保姆级教程
  • 阿里云代理商:阿里云CDN访问问题怎么诊断?
  • 关于yolov5 v2.0本地运行出现 的一些问题的解决
  • jsp做的网页是网站吗毕业设计拼车网站的建设雨实现
  • 不用ftp可以做网站吗html个人网页设计代码
  • AI 时代的数据通道:云消息队列 Kafka 的演进与实践
  • AWS云上Quickwit部署指南与成本分析