Go中的切片Slice
Go中的切片Slice
切片概念
切片是一种数据结构, 是一种动态数组, 按需自动改变大小, 可以方便的管理和使用数据集合
内部实现
- 切片基于数组实现的, 切片的底层是数组。
- 切片本身非常小, 是对数组的抽象
- 因为切片基于数组实现的, 所以底层的内存是连续分配的, 效率非常高
- 切片可以通过索引获得数据, 可以迭代以及垃圾回收优化
- 切片是对数组view的映射, 公用底层数组, 改变切片就会改变底层数组
切片声明和初始化
声明
make
方法, 单独参数, 既指定长度也指定容量// 长度和容量都是5slice := make([]int, 5) 复制代码
make
方法, 两个参数, 指定长度和容量// 长度为5, 容量为10(容量对应底层数组) slice := make([]int, 5, 10)复制代码
- 切片的底层为数组, 切片不指定值默认为零值
- 切片长度为5, 容量为10, 所以只能访问5个值
- 剩下5个元素需要切片扩充后才能访问
- 切片的容量必须 >= 切片的长度
使用
:=
创建切片// 此时切片的长度和容量都是5slice:=[]int{1,2,3,4,5} 复制代码
使用
:=
创建部分切片// 此时切片的长度和容量都是5 slice:=[]int{4:1} 复制代码
数组和切片的区别
//数组 array:=[5]int{4:1} //切片 slice:=[]int{4:1} 复制代码
nil切片和空切片的区别, 他们的长度和容量都是0, 指向的底层数组不同
- nil切片指向底层数组的指针为nil, 表示不存在的切片
- 空切片指向的底层数组为指针为地址, 表示空切片集合
//nil切片 var nilSlice []int //空切片 slice:=[]int{} 复制代码
基于现有的数组或者切片创建切片
- 使用[i:j]来创建新的切片, i为索引开始, j为索引结束, 半开半闭区间, 包含i, 不包含j
- i 和 j 都可省略, 省略后默认为 0 和 len(slice) - 1
- 对于数组或者切片(容量为k)创建新的切片(slice[i:j])后的长度和容量为
长度为j - i
, 容量为k - i
- 系统内置方法长度为
len(slice)
, 容量为cap(slice)
使用第三个值来限制切片容量
- 创建了一个长度为
2 - 1 = 1
, 容量为3 - 1 = 2
- 第三个值不能超过原切片容量的最大值
slice := []int{1, 2, 3, 4, 5}
newSlice := slice[1:2:3]
复制代码
向切片追加值
- 通过
append
方法向切片追加值
slice := []int{1, 2, 3, 4, 5}
newSlice := slice[1:3]newSlice=append(newSlice,10)
fmt.Println(newSlice)
fmt.Println(slice)
//Output
[2 3 10]
[1 2 3 10 5]
复制代码
- 通过
append
同时追加许多值
newSlice=append(newSlice,10,20,30)
复制代码
- 通过
...
和append
向切片中追加切片
slice := []int{1, 2, 3, 4, 5}
newSlice := slice[1:2:3]newSlice = append(newSlice, slice...)
复制代码
- append函数会智能的增长底层数组的容量,目前的算法是:容量小于1000个时,总是成倍的增长,一旦容量超过1000个,增长因子设为1.25,也就是说每次会增加25%的容量。
迭代切片
- 使用
for range
迭代切片
slice := []int{1, 2, 3, 4, 5}
for i,v:=range slice{fmt.Printf("索引:%d,值:%d\n",i,v)
}
复制代码
- 也可以使用
for
迭代切片
slice := []int{1, 2, 3, 4, 5}
for i := 0; i < len(slice); i++ {fmt.Printf("值:%d\n", slice[i])
}
复制代码
注意点
range
返回的是切片元素的复制, 不是元素的引用
在函数中传递切片
func main() {slice := []int{1, 2, 3, 4, 5}fmt.Printf("%p\n", &slice)modify(slice)fmt.Println(slice)
}
func modify(slice []int) {fmt.Printf("%p\n", &slice)slice[1] = 10
}
复制代码
注意点
- 传递复制切片时, 底层数组不会被复制, 也不会收影响, 复制只是复制的切片本身, 不涉及底层数组
转载于:https://juejin.im/post/5b6911e2518825018c4d0a91
Go中的切片Slice相关推荐
- 在pythonnumpy中切片(slice)
转载自:博客 在python&numpy中切片(slice) 上文说到了,词频的统计在数据挖掘中使用的频率很高,而切片的操作同样是如此.在从文本文件或数据库中读取数据后,需要对数据进行预处理的 ...
- golang中的切片
slice 注意,切片代表的窗口是无法向左扩展的 顺便提一下把切片的窗口向右扩展到最大的方法.对于s4来说,切片表达式s4[0:cap(s4)]就可以做到 一个切片的容量可以被看作是透过这个窗口最多可 ...
- 切片slice(python)
切片slice 作用:从容器中取出相应的元素重新组成一个容器. 语法:容器[(开始索引):(结束索引)(:(步长))] 小括号()括起的部分代表可省略 说明: 结束索引不包含该位置元素 步长是切片每次 ...
- 位置2的索引超出数组范围不能超过10_golang学习笔记--切片slice 与数组 arr
因为我是写php的,刚开始写go的时候老是被数组坑.因为在go中的数组是固定长度,所以会存在越界的时候.而在go中也很少直接使用数组.更多的时候会使用slice(切片). 数组 数组是一个由固定长度的 ...
- golang中的切片及内存拷贝
十分钟讲明白, golang, Go 语言切片(Slice) 2017年08月21日 16:39:21 kingmax54212008 阅读数:8782 https://blog.csdn.net/k ...
- 切片 go 去除第一个_golang学习笔记--切片slice 与数组 arr
因为我是写php的,刚开始写go的时候老是被数组坑.因为在go中的数组是固定长度,所以会存在越界的时候.而在go中也很少直接使用数组.更多的时候会使用slice(切片). 数组 数组是一个由固定长度的 ...
- 【Go】Go 语言切片(Slice)
文章目录 一.切片 二.声明切片 方法1 方法2 总结:创建切片的各种方式 三.切片初始化 1. 声明的同时初始化 2. 用数组初始化切片 3. 切片的内存布局: 读写操作实际目标是底层数组,只需注意 ...
- Go开发 之 容器(数组Array、切片slice、映射map、列表list)
文章目录 0.唠唠叨叨 1.数组-Array 1.1.什么是数组 1.1.1.数组的声明 1.1.2.比较两个数组是否相等 1.1.3.示例 1.1.3.1.通过索引下标访问元素 1.1.3.2.数组 ...
- python切片是什么意思_python中的切片是什么?(实例解析)
在以下的文章之中我们来了解一下什么是python中的切片.了解一下python中的切片是什么意思,以及切片在python之中能起到什么样的作用. 取一个list或tuple的部分元素是在python编 ...
- Golang 入门 : 切片(slice)
切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数 append( ...
最新文章
- OpenCASCADE Make Primitives-Sphere
- 卡巴斯基授权许可文件_安全许可证的申请流程有哪些?
- 文档null一段 虚拟机操作
- php图片生成缩略图_PHP实现生成图片缩略图函数
- 博图如何读取mysql数据_博途使用小结:从SQL中读取数据并给变量赋值
- Ability的基本概念(2)
- Node.js模块之Buffer
- java 向父类_Java基础——面向对象(Object父类)
- python实现一个数如果恰好等于它的因子之和,这个数就称为“完数” 。例如, 6的因子为 1、2、3,而 6=1+2+3,因此 6 是完数。编程找出1000之内的所有完数
- 揭露一种通过网络实施ATM诈骗的手段!
- Nginx增加第三方外部插件
- HDU 2609 最小表示法
- 调用赋码远程服务异常_Remoting远程访问的这个异常怎么处理???
- 一文教会你使用 Neo4j 快速构建明星关系图谱
- 丽江旅游线路规划丽江游玩小贴士丽江游玩攻略花费
- 电脑小鸟壁纸怎么彻底删除?
- 艾草减肚子方法非常有效 赛乐赛骗局是真的吗
- python爬虫教程下载-Python网络爬虫从入门到精通 PDF 下载
- 二手交易APP开发主要功能有哪些?(二)
- ​K歌中的歌唱评价与嗓音分析
热门文章
- h5红包雨代码_【多管闲事】非专业人士H5学习指北:从门还没入到放弃 | 叙一来闲...
- solr html显示,在SOLR中,如何执行索引. html 文件_solr_开发99编程知识库
- linux qt读取显示图片,QT学习篇(二) 使用QPixmap显示一张图片
- Android的JNI【实战教程】3⃣️--Java调用C代码
- 怎么用计算机excel计算矩阵,怎样用EXCEL进行矩阵计算?
- mysql更改密码_Mysql更改密码、连接mysql、mysql常用命令
- C语言substr函数用法,自己实现substr函数——C语言
- sql developer下载_开放下载!《Rocket MQ 使用排查指南》精解100+常见问题
- java中堆 栈的英文_Java中的栈和堆
- java案例代码9-冒泡算法: