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

GO_复合类型---切片

一、切片核心概念

  1. 本质:对底层数组的引用,不是值类型,是引用类型
  2. 作用:弥补数组长度固定的缺陷,实现动态变长数组
  3. 定义:声明时不指定长度,格式[]T(T 为元素类型)

二、切片的创建方式(4 种常用)

1. 从数组 / 切片截取(最基础)

语法:切片名 := 源数组/切片[low:high:max]

  • low:起始下标(包含),默认 0
  • high:结束下标(不包含,左闭右开),默认末尾
  • max:容量上限,默认等于底层数组容量
  • 长度公式len = high - low
  • 容量公式cap = max - low

go

// 示例 array := [...]int{10, 20, 30, 0, 0} // 固定长度数组 slice := array[0:3:5] // len=3-0=3,cap=5-0=5,元素:[10,20,30]

2. 自动推导类型创建

go

// 直接初始化切片,长度=元素个数,容量=长度 s1 := []int{1, 2, 3, 4, 5}

3. make 函数创建(开发最常用)

语法:make([]T, len, cap)

  • 不指定容量:cap = len
  • 必须指定长度,容量≥长度

go

s2 := make([]int, 5, 10) // len=5,cap=10 s3 := make([]int, 5) // 无容量,len=cap=5 s4 := []int{} // 空切片,len=0,cap=0

三、切片的长度 (len) 和容量 (cap)

  • 长度 (len):切片中实际存储的元素个数
  • 容量 (cap):底层数组从起始位置到末尾的最大可存储元素个数(决定扩容时机)

go

func main() { a := []int{1, 2, 3, 0, 0} s := a[0:3:5] fmt.Println("len(s) =", len(s)) // 3 fmt.Println("cap(s) =", cap(s)) // 5 s2 := a[1:4:5] fmt.Println("len(s2) =", len(s2)) // 3 (4-1) fmt.Println("cap(s2) =", cap(s2)) // 4 (5-1) }

四、切片截取操作(常用简写)

go

array := []int{0,1,2,3,4,5,6} s1 := array[:] // 全量截取:low=0,high=len,cap=cap s2 := array[3:6] // 不写max:cap=底层数组容量 s3 := array[:6] // 从0开始到下标6,最常用 s4 := array[3:] // 从下标3开始到末尾

五、切片与底层数组的关系(核心重点)

切片共享底层数组,修改切片元素会直接修改原数组 / 其他切片,属于引用传递

go

func main() { a := []int{0,1,2,3,4,5,6,7,8,9} s1 := a[2:5] // [2,3,4],引用a数组 // 修改切片元素 → 原数组同步修改 s1[1] = 666 fmt.Println("s1 =", s1) // [2,666,4] fmt.Println("a =", a) // 原数组下标3变为666 // 切片再截取 → 仍共享底层数组 s2 := s1[2:7] // [4,5,6,7,8] s2[2] = 777 fmt.Println("a =", a) // 原数组下标6变为777 }

六、append () 追加元素(动态扩容)

append是切片动态扩容的核心函数,超出容量时自动扩容

1. 基础用法

go

s1 := []int{} // 空切片 s1 = append(s1, 1) // 追加单个元素 s1 = append(s1, 2, 3) // 追加多个元素

2. 扩容规则

  • 容量不足时,默认以 2 倍容量扩容(小切片)
  • 扩容后会新建底层数组,不再与原数组共享

go

// 验证扩容机制 func main() { s := make([]int, 0, 1) oldCap := cap(s) for i := 0; i < 8; i++ { s = append(s, i) if newCap := cap(s); oldCap < newCap { fmt.Printf("cap: %d ===> %d\n", oldCap, newCap) oldCap = newCap } } } /* 输出: cap: 1 ===> 2 cap: 2 ===> 4 cap: 4 ===> 8 */

七、copy () 切片复制

解决切片共享底层数组的问题,深拷贝,两个切片完全独立。

go

func main() { srcSlice := []int{1, 2} // 源切片 dstSlice := []int{6,6,6,6} // 目标切片 copy(dstSlice, srcSlice) // 复制:将源切片元素拷贝到目标切片 fmt.Println("dst =", dstSlice) // [1,2,6,6] }

八、切片作为函数参数

切片是引用类型,函数内修改切片,外部原切片同步修改(无需指针)。

实战:切片初始化 + 冒泡排序

go

import ( "math/rand" "time" ) // 初始化切片:随机数赋值 func InitData(s []int) { rand.Seed(time.Now().UnixNano()) for i := 0; i < len(s); i++ { s[i] = rand.Intn(100) // 0-99随机数 } } // 冒泡排序:切片做参数,直接修改原切片 func BubbleSort(s []int) { n := len(s) for i := 0; i < n-1; i++ { for j := 0; j < n-i-1; j++ { if s[j] > s[j+1] { s[j], s[j+1] = s[j+1], s[j] // 交换元素 } } } } func main() { // 创建切片 s := make([]int, 10) InitData(s) fmt.Println("排序前:", s) BubbleSort(s) fmt.Println("排序后:", s) }

九、核心易错点总结

  1. 切片不存储数据,底层依赖数组,是引用类型
  2. [low:high]左闭右开,不包含 high 下标元素
  3. len=high-lowcap=max-low
  4. append扩容后会新建底层数组,断开与原数组的关联
  5. 切片做函数参数,传引用,修改会影响原切片
  6. copy可以实现切片深拷贝,避免共享数组

总结

  1. 切片是 Go 的动态数组,专门解决数组长度固定的痛点,开发优先用切片
  2. 核心操作:截取、append扩容、copy拷贝、函数传参
  3. 核心原理:引用底层数组,扩容机制是 2 倍扩容
  4. 实战中:优先用make创建切片,用append动态添加元素
http://www.jsqmd.com/news/1169834/

相关文章:

  • 如何统一管理多品牌RGB设备:OpenRGB开源灯光控制完整指南
  • 工业级负载控制方案:TPD2015FN与PIC18F47J53应用解析
  • 面试官:Agent上线后行为失控,你怎么管?我:加规则!他:就这?
  • OpenSSL 3.0 实战:5种常见SSL/TLS握手失败告警的抓包复现与诊断
  • 2026新西兰移民机构推荐榜单 多维度综合排行整理 - 互联网科技品牌测评
  • “敏捷可以响应变化,但变化从来不是免费的”
  • 为什么93%的人用错ChatGPT做健身计划?运动生物力学专家拆解:关节力矩模型缺失、ROM参数未绑定、营养-训练耦合失效(附修正版结构化提示词)
  • NVIDIA Profile Inspector完整指南:解锁显卡隐藏设置的终极免费工具
  • 团队AI编程工具选型指南:从上下文协同到架构推演
  • Unity3D动画文件优化实战:从导入压缩到运行时性能提升
  • Claude Code CLI工业级AI Agent架构与优化实践
  • WPF .NET 6/8 嵌入 WinForm 控件:解决 3 大布局与渲染兼容性问题
  • 2026年7月最新徐州泰格豪雅官方售后热线及客户服务网点地址 - 亨得利官方服务中心
  • GraphRAG索引质量评估 Checklist:小白也能看懂,收藏这份实用指南!
  • 国内环境下的AI图像生成技术实现与合规应用指南
  • Unity卡牌游戏UI框架:数据驱动与模块化设计实践
  • 义乌音品汇汽车音响:解锁汽车音响改装的理想之选,保时捷原厂音响升级/音响改装/宝马原厂音响升级,汽车音响改装旗舰店哪家好 - 音响改装门店分享
  • UE4/UE5项目资产命名规范:提升团队协作效率的黄金标准
  • Bright Data实战:穿透LinkedIn/TikTok反爬的合规数据管道
  • 蓝牙耳机真实性能验证指南:五维交叉测试法
  • HarmonyOS NavPathStack 实战:中式美食详情页怎么记住用户从搜索、收藏还是推荐进来
  • C++23 与 CLion 的强强联合:开启现代 C++ 开发新篇章
  • 小红书爆款标题生成器(已内嵌2024Q3算法白皮书参数):ChatGPT本地化微调全流程
  • 贵州大学《大学物理1-1》期末试卷及答案16-17 18-19 20-24学年
  • 基因组文库 vs cDNA文库:3大核心差异、4项应用场景选择与2种构建策略对比
  • OpenCore Legacy Patcher完整教程:4步让老Mac完美运行最新macOS
  • Cocos Creator打包发布全攻略:从构建配置到多平台部署实战
  • STM32F4 FSMC 模式A时序配置实战:SRAM读写速度提升30%的关键参数解析
  • ArkTS 持久化实战:中式美食怎么把 Preferences 快速状态同步到 RDB 明细表
  • Copilot自动生成PPT总“跑偏”?深度解析其底层RAG架构与提示词对齐原理(附可复用的Slide-LLM Prompt框架)