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

理解 Go 中的切片:append 操作的深入分析(篇2)

理解 Go 语言中 slice 的性质对于编程非常有益。下面,我将通过代码示例来解释切片在不同函数之间传递并执行 append 操作时的具体表现。

本篇为第 2 篇,当切片的容量 cap 不够时

func main() {// slice1 当前长度为 3,容量大小也为 3slice1 := make([]int, 3, 3)fmt.Println("slice 1:", slice1, len(slice1), cap(slice1))test1(slice1)fmt.Println("slice 1:", slice1, len(slice1), cap(slice1))
}func test1(slice2 []int) {slice2[0] = 1slice2 = append(slice2, 1)	// append 操作slice2[0] = 2fmt.Println("slice 2:", slice2, len(slice2), cap(slice2))
}

输出:

slice 1[0 0 0] 3 3
slice 2[2 0 0 1] 4 6
slice 1[1 0 0] 3 3

解释:在 test1 函数中,我们首先将 slice2 的第一个元素设为 1(这个更改也反映在 slice1 上),然后对其执行 append 操作。

因为 slice2 的容量已满(3/3),所以 append 操作会触发底层数组的扩容。
当新的底层数组准备好之后,我们再次更改 slice2 的第一个元素,将其设为 2。这次的更改并不影响 slice1,因为扩容操作已使 slice2 指向新的底层数组。

示意图如下:

切片append_流程图(cap不足)

http://www.lryc.cn/news/125572.html

相关文章:

  • GPT-4 如何为我编写测试
  • java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration
  • 19、SQL注入之SQLMAP绕过WAF
  • Redis对象类型和结构、内存回收、对象共享
  • 标准模板库STL——容器适配器-stack/queue/priority_queue
  • Golang实现完整聊天室(内附源码)
  • WSL2 ubuntu子系统OpenCV调用本机摄像头的RTSP视频流做开发测试
  • 20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统
  • 基于ScrollView的下拉刷新
  • 强训第31天
  • 什么是Java中的策略模式?
  • 【Visual Studio Code】--- Win11 安装 VS Code 超详细
  • 每天一道leetcode:797. 所有可能的路径(图论中等深度优先遍历)
  • 创建预留成本中心与指定工厂不一致
  • SCF金融公链新加坡启动会 创新驱动未来
  • 希尔排序【Java算法】
  • 互联网发展历程:从布线到无线,AC/AP的崭新时代
  • Vue3 Axios网络请求简单应用
  • day-18 代码随想录算法训练营(19)二叉树 part05
  • 【数据结构OJ题】移除链表元素
  • centos 安装 virtualbox
  • Java8之Optional类的基本使用
  • LinuxPTP时间同步
  • 【Django】Task1安装python环境及运行项目
  • 00 - 环境配置
  • R语言实现计算净重新分类指数(NRI)和综合判别改善指数(IDI)
  • 【面试总结】八股①
  • AI绘画 | 一文学会Midjourney绘画,创作自己的AI作品(快速入门+参数介绍)
  • MongoDB 数据库详细介绍
  • Qt在mac安装