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

Go语言中的切片

Go 语言中的切片(Slice)是一个非常核心的数据结构,它是对数组的抽象和封装,提供了更灵活、强大的序列处理能力。

一.切片的基本概念

切片是一个动态数组,它由三个部分组成:

  • 指针:指向底层数组的起始位置

  • 长度(len):切片中当前元素的数量

  • 容量(cap):切片可以容纳的最大元素数量

注意:切片不是数组本身,而是数组的一层抽象。

二、数组 vs 切片(先分清)

数组(Array)

var a [3]int = [3]int{1, 2, 3}
  • 长度固定

  • 值类型

  • 很少直接用在业务代码中

切片(Slice)

var s []int = []int{1, 2, 3}
  • 长度可变

  • 引用语义

  • Go 业务代码的主角

三、切片的底层结构(非常重要)

Go 的切片在运行时是一个结构体:

type slice struct { ptr *T // 指向底层数组 len int // 当前长度 cap int // 容量 }

知识的三点:

  1. len:当前“能用”的元素个数

  2. cap:从ptr开始,底层数组最多能放多少

  3. 多个切片可能共享同一个底层数组

四、创建切片的几种方式

1. 字面量创建(最常用)

s := []int{1, 2, 3}
  • len = 3

  • cap = 3

2. 使用make函数创建(最推荐)

s := make([]int, 2, 5)

含义:

  • 长度 = 2(已有 2 个元素,默认值)

  • 容量 = 5(最多可扩到 5),可缺省。

3. 从数组 / 切片切出来

arr := [5]int{1, 2, 3, 4, 5} s := arr[1:4] // [2 3 4]

规则:

s := a[low : high] // 左闭右开

这是“视图”,不是拷贝

五、append:切片的扩容机制

基本用法,append会触发cap翻倍扩容

s := []int{1, 2} s = append(s, 3) //cap扩容为原来的2倍 fmt.Println(len(s), cap(s))

输出:3,4

扩容规则

  • 小容量:2 倍增长

  • 大容量:逐渐放缓(≈1.25x)

  • 具体策略由 Go runtime 决定

六、如何安全拷贝切片

使用 copy(官方推荐)

src := []int{1, 2, 3} dst := make([]int, len(src)) copy(dst, src) fmt.Println(dst)

输出:[1 2 3]

七、nil slice vs 空 slice

var s1 []int // nil slice s2 := []int{} // 空 slice s3 := make([]int,0) // 空 slice
属性s1s2 / s3
len00
cap00
== niltruefalse
append

八、切片作为函数参数

func modify(s []int) { s[0] = 100 }
  • 修改元素 → 会影响外部

  • append 扩容 → 不一定影响外部

因为 slice 本身是值传递(复制 slice 结构体)

九、遍历切片

for

for i := 0; i < len(s); i++ { fmt.Println(s[i]) }

range(最常用)

for i, v := range s { fmt.Println(i, v) }
http://www.jsqmd.com/news/106849/

相关文章:

  • 基于单片机的防火防盗报警系统设计
  • 信息化、数字化、数智化的区别:300+大公司实战经验,看完不踩坑
  • 学历低学网络安全行吗?
  • MCU+AT,必将让位于OpenCPU【第五章】
  • AI时代核心竞争力:手写多智能体系统,不依赖LangChain/LlamaIndex
  • CordovaOpenHarmony费用统计与分析
  • 第十七篇:Day49-51 前端工程化进阶——从“手动”到“自动化”(对标职场“提效降本”需求)
  • Python大数据基于机器学习的农产品价格数据分析与预测的可视化系统的设计与实现_y602itt4_tn045--论文
  • 30岁前端的十字路口!兄弟们,还有其他选择吗?
  • Radm1n1ster DS
  • 【必藏】后端工程师转行AI大模型开发全攻略:从零基础到高薪工程师的技能路径与学习资料免费分享
  • 出口美国的电子电器产品需要做FCC认证吗?
  • Linux如何查看磁盘使用情况?
  • N-乙酰-D-半乳糖胺——引领靶向递送新时代的关键糖分子 CAS:1811-31-0
  • Python大数据基于机器学习的电商评论情感分析_6z73z1t1_论文
  • Java 的责任分层能力:为什么复杂系统里的问题,更容易被“放对位置”
  • 《国产数据库技术》学习心得:DM数据库实践之路
  • Python大数据基于深度学习的饮食计划推荐与交流分享平台_j6yqgmwm--论文
  • QM申报流程及要求
  • 第十八篇:Day52-54 前端跨端开发进阶——从“多端适配”到“跨端统一”(对标职场“全栈化”需求)
  • 数据集成怎么做才管用?这篇讲透了
  • Python大数据使用Vue.js构建的大数据分析与可视化系统_m1sf2x1m_c008
  • ARMv8-M架构IPSR寄存器读取函数解析
  • Python大数据基于深度学习的家庭用电量预测模型研究_u0iaagil--论文
  • Python和PHP学哪个比较好?
  • 互联网大厂Java面试纪实:微服务、消息队列与AI实战全流程拆解
  • Flink源码阅读:状态管理
  • Python大数据基于数据挖掘的高考志愿推荐系统的设计与实现_3ri592gf_论文
  • CordovaOpenHarmony费用趋势分析
  • 数字员工与熊猫智汇是什么?主要具备哪些智能化特性?