【Go】探索 Go 语言的内建函数 make


山水间歌声回荡
回荡思念的滚烫
去年的家书两行
读来又热了眼眶
云水边静沐暖阳
烟波里久违的故乡
别来无恙
你在心上
                     🎵 张靓颖/张杰《燕归巢》


在 Go 语言中,make 是一个非常强大的内建函数,用于创建和初始化特定类型的数据结构,包括切片(slice)、映射(map)和通道(channel)。掌握 make 的使用方法,可以帮助我们更高效地管理内存和数据结构。本文将详细介绍 make 函数的使用场景和示例。

make 函数的基本语法

make 函数的基本语法如下:

make(type, size, [capacity])
  • type:指定要创建的数据结构类型,可以是切片、映射或通道。
  • size:指定初始长度(对于切片)或初始大小(对于通道)。
  • capacity(可选):仅适用于切片,指定其容量。

创建切片

使用 make 函数创建切片时,可以指定切片的初始长度和容量。如果未指定容量,默认与长度相同。

package mainimport "fmt"func main() {// 创建长度为 5 的切片slice1 := make([]int, 5)fmt.Println("slice1:", slice1) // 输出:slice1: [0 0 0 0 0]// 创建长度为 5,容量为 10 的切片slice2 := make([]int, 5, 10)fmt.Println("slice2:", slice2) // 输出:slice2: [0 0 0 0 0]fmt.Println("slice2 容量:", cap(slice2)) // 输出:slice2 容量: 10
}

创建映射

使用 make 函数创建映射时,只需要指定映射的类型。映射会自动调整大小,因此不需要指定初始容量,但可以提供一个初始容量以提高性能。

package mainimport "fmt"func main() {// 创建一个映射m := make(map[string]int)m["a"] = 1m["b"] = 2fmt.Println("map:", m) // 输出:map: map[a:1 b:2]// 创建一个初始容量为 10 的映射m2 := make(map[string]int, 10)fmt.Println("map2:", m2) // 输出:map2: map[]
}

创建通道

使用 make 函数创建通道时,需要指定通道的类型和缓冲区大小。如果缓冲区大小为 0,则创建的是无缓冲通道。

package mainimport "fmt"func main() {// 创建一个无缓冲通道ch1 := make(chan int)go func() {ch1 <- 1}()fmt.Println("ch1:", <-ch1) // 输出:ch1: 1// 创建一个带缓冲区大小为 5 的通道ch2 := make(chan int, 5)ch2 <- 1ch2 <- 2fmt.Println("ch2 容量:", cap(ch2)) // 输出:ch2 容量: 5fmt.Println("ch2 长度:", len(ch2)) // 输出:ch2 长度: 2
}

使用 make 函数的注意事项

  • 与 new 区别:make 函数只用于创建切片、映射和通道,并且返回的是初始化后的数据结构;而 new 函数用于分配内存,并返回指向零值的指针。
  • 初始容量:为切片或映射指定初始容量可以提高性能,特别是在预期会存储大量数据的情况下。
  • 无缓冲与缓冲通道:无缓冲通道用于同步,而带缓冲区的通道则允许异步操作。根据需求选择合适的通道类型。

示例代码

以下是一个综合示例,展示了如何使用 make 函数创建切片、映射和通道:

package mainimport "fmt"func main() {// 创建切片slice := make([]int, 5, 10)fmt.Println("切片:", slice) // 输出:切片: [0 0 0 0 0]fmt.Println("切片容量:", cap(slice)) // 输出:切片容量: 10// 创建映射m := make(map[string]int)m["a"] = 1m["b"] = 2fmt.Println("映射:", m) // 输出:映射: map[a:1 b:2]// 创建通道ch := make(chan int, 5)ch <- 1ch <- 2fmt.Println("通道容量:", cap(ch)) // 输出:通道容量: 5fmt.Println("通道长度:", len(ch)) // 输出:通道长度: 2
}

总结

make 是 Go 语言中的一个关键函数,它帮助我们高效地创建和初始化切片、映射和通道。理解和正确使用 make 函数,可以显著提高代码的性能和可维护性。希望这篇博客能帮助你更好地理解和使用 Go 语言中的 make 函数,让你的编程之旅更加顺畅。

Happy coding!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM与搜索推荐

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

VScode连接服务器免密登录

1、生成 SSH 密钥对 打开终端并输入以下命令生成 SSH 密钥对&#xff1a; 直接搜索 cmd&#xff0c;然后输入&#xff1a; ssh-keygen -t rsa -b 4096 一直回车就好了 这时公钥存储在/Users/你的用户名/.ssh/id_rsa.pub文件里&#xff0c;私钥存储在/Users/你的用户名/.ss…

B Tree和B+ Tree的区别

1. 叶子节点的存储 2. 查询效率 3. 范围查询 4. 内存使用 5. 插入和删除 6. 应用场景 总结 B树&#xff08;B-Tree&#xff09;和B树&#xff08;B Tree&#xff09;都是广泛应用于数据库和文件系统中的自平衡树数据结 构&#xff0c;主要用于存储和检索大量数据。虽然它…

简单的数据结构:栈

1.栈的基本概念 1.1栈的定义 栈是一种线性表&#xff0c;只能在一端进行数据的插入或删除&#xff0c;可以用数组或链表来实现&#xff0c;这里以数组为例进行说明 栈顶 &#xff1a;数据出入的那一端&#xff0c;通常用Top表示 栈底 :相对于栈顶的另一端&#xff0c;也是固…

Unity 动画曲线(Animation Curves):创造流畅动画的关键

在Unity中&#xff0c;动画曲线&#xff08;Animation Curves&#xff09;是一种强大的工具&#xff0c;用于在动画和游戏开发中创建平滑且自然的过渡效果。通过动画曲线&#xff0c;开发者可以轻松地控制动画参数随时间的变化&#xff0c;实现复杂的动画效果。本文将探讨Unity…

gitee R包安装

要安装giteeR包&#xff0c;你可以使用以下步骤&#xff1a; 安装remotes包&#xff1a;giteeR包不是CRAN上的标准包&#xff0c;因此你需要使用remotes包从Git仓库安装。 install.packages("remotes")从Gitee安装giteeR包&#xff1a; remotes::install_git("h…

黑马头条vue2.0项目实战(一)——项目初始化

1. 图标素材&#xff08;iconfont简介&#xff09; 制作字体图标的工具有很多&#xff0c;推荐使用&#xff1a;iconfont-阿里巴巴矢量图标库。 注册账户 创建项目 可以根据项目自定义 class 前缀 上传图标到项目 生成链接&#xff0c;复制 css 代码&#xff0c;在项目中使用…

【知识梳理】Shell的变量计算

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 Shell中有很多变量的计算&#xff0c;会用到多种运算符。例如这几种&#xff1a; 1. Shell中常见的算术运算符 运算符意义&…

CF961(div2)a-c

CF961&#xff08;div2&#xff09; A. Diagonals&#xff08;贪心&#xff09; 题意&#xff1a;有n*n的棋盘&#xff0c;有k个筹码&#xff0c;将这些筹码放在棋盘上&#xff0c;对角线指ij值相同的&#xff0c;求被占对角线的最少数目 分析:除了第n条对角线只有一条&…

github-page静态网页将字符串写入github库中文本文档

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 问题描述 github-page静态…

kaggleyyds碉堡了6相见恨晚

kaggleyyds碉堡了6相见恨晚https://www.kaggle.com/

Natutre Methods|单细胞+空间转录,值得去复现的开源单细胞分析pipeline

肺癌是全球第二大最常见的癌症&#xff0c;也是癌症相关死亡的主要原因。肿瘤生态系统具有多种免疫细胞类型。尤其是髓系细胞&#xff0c;髓系细胞普遍存在&#xff0c;并且在促进疾病方面发挥着众所周知的作用。该篇通过单细胞和空间转录组学分析了 25 名未经治疗的腺癌和鳞状…

网络模型优化——从参数向量到性能提升的最优化之旅

网络模型优化——从参数向量到性能提升的最优化之旅 网络模型优化的核心作用 组件/步骤描述参数向量网络模型中的可学习部分&#xff0c;决定了模型的输出泛函最优化通过调整参数向量以最小化或最大化某个目标函数的过程目标函数用于评估模型性能的指标&#xff0c;如损失函数…

【初阶数据结构篇】顺序表的实现(赋源码)

文章目录 本篇代码位置顺序表和链表1.线性表2.顺序表2.1 概念与结构2.2分类2.2.1 静态顺序表2.2.2 动态顺序表 2.3 动态顺序表的实现2.3.1动态顺序表的初始化和销毁及打印2.3.2动态顺序表的插入动态顺序表的尾插动态顺序表的头插动态顺序表的在指定位置插入数据 2.3.3动态顺序表…

区块链——hardhat使用

一、引入hardhat yarn add --dev hardhat // 引入验证合约的插件 yarn add --dev nomicfoundation/hardhat-verify 二、创建hardhat项目 yarn hardhat 三、编写我们的合约 四、编译我们的合约 yarn hardhat compile 五、编写脚本部署合约以及验证合约 // 获取hardhat环境对象 c…

openstack——11道练习题创建云主机篇

查看主机 sudo virsh list --all sudo virsh snapshot-list compute-cs8 sudo virsh snapshot-revert compute-cs8 init3 ssh root172.24.1.xx source /root/keystonerc_admin 1、在 OpenStack 云平台创建名为 project12-xxxx 的项目&#xff0c;并查询项目列表信息。&#xff…

Python操作Redis指南

文本主要介绍使用Python中的redis-py库来操作Redis数据库&#xff0c;包括安装必要的包、建立和关闭连接、执行增删改查操作以及处理可能的异常。这些操作将在Python应用程序中与Redis数据库进行有效的交互。 一. 简介和包的安装 Redis是一种开源的内存数据结构存储&#xff…

Postman实战:API幂等性测试全解析与实践技巧

Postman实战&#xff1a;API幂等性测试全解析与实践技巧 在API开发和测试中&#xff0c;幂等性是一个重要的概念。一个幂等的API意味着对同一请求重复执行多次的结果与执行一次相同。这在处理用户操作、数据同步和网络请求时尤为重要。本文将详细介绍如何在Postman中实现API的…

Jmeter混合压测(2407)

一 压测需求&#xff1a; 电商作为服务端&#xff0c;至少需要满足并发量,QPS:100/s,TPS:20/s。例如场景&#xff1a; 电商交易中&#xff0c;商品图片请求量最多&#xff0c;电商服务端需要满足并发请求查询图片信息。各家可能会并发请求同一家电商商品、订单等内容。 二 压…

代码随想录算法训练营day7 | 454.四数相加II、383.赎金信、15.三数之和、18.四数之和

文章目录 454.四数相加II思路 383.赎金信思路 15.三数之和思路剪枝去重 18.四数之和思路剪枝去重复习&#xff1a;C中的类型转换方法 总结 今天是哈希表专题的第二天 废话不多说&#xff0c;直接上题目 454.四数相加II 建议&#xff1a;本题是 使用map 巧妙解决的问题&#x…