Go中的切片Slice

切片概念

切片是一种数据结构, 是一种动态数组, 按需自动改变大小, 可以方便的管理和使用数据集合

内部实现

  1. 切片基于数组实现的, 切片的底层是数组。
  2. 切片本身非常小, 是对数组的抽象
  3. 因为切片基于数组实现的, 所以底层的内存是连续分配的, 效率非常高
  4. 切片可以通过索引获得数据, 可以迭代以及垃圾回收优化
  5. 切片是对数组view的映射, 公用底层数组, 改变切片就会改变底层数组

切片声明和初始化

声明

  • make方法, 单独参数, 既指定长度也指定容量

  • // 长度和容量都是5slice := make([]int, 5)
    复制代码
  • make方法, 两个参数, 指定长度和容量

  • // 长度为5, 容量为10(容量对应底层数组)
    slice := make([]int, 5, 10)复制代码
    1. 切片的底层为数组, 切片不指定值默认为零值
    2. 切片长度为5, 容量为10, 所以只能访问5个值
    3. 剩下5个元素需要切片扩充后才能访问
    4. 切片的容量必须 >= 切片的长度
  • 使用:=创建切片

    // 此时切片的长度和容量都是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{}
    复制代码

基于现有的数组或者切片创建切片

  1. 使用[i:j]来创建新的切片, i为索引开始, j为索引结束, 半开半闭区间, 包含i, 不包含j
  2. i 和 j 都可省略, 省略后默认为 0 和 len(slice) - 1
  3. 对于数组或者切片(容量为k)创建新的切片(slice[i:j])后的长度和容量为 长度为j - i, 容量为k - i
  4. 系统内置方法长度为len(slice), 容量为cap(slice)

使用第三个值来限制切片容量

  1. 创建了一个长度为 2 - 1 = 1, 容量为3 - 1 = 2
  2. 第三个值不能超过原切片容量的最大值
slice := []int{1, 2, 3, 4, 5}
newSlice := slice[1:2:3]
复制代码

向切片追加值

  1. 通过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]
复制代码
  1. 通过append同时追加许多值
newSlice=append(newSlice,10,20,30)
复制代码
  1. 通过...append向切片中追加切片
slice := []int{1, 2, 3, 4, 5}
newSlice := slice[1:2:3]newSlice = append(newSlice, slice...)
复制代码
  1. append函数会智能的增长底层数组的容量,目前的算法是:容量小于1000个时,总是成倍的增长,一旦容量超过1000个,增长因子设为1.25,也就是说每次会增加25%的容量。

迭代切片

  1. 使用for range迭代切片
slice := []int{1, 2, 3, 4, 5}
for i,v:=range slice{fmt.Printf("索引:%d,值:%d\n",i,v)
}
复制代码
  1. 也可以使用for迭代切片
slice := []int{1, 2, 3, 4, 5}
for i := 0; i < len(slice); i++ {fmt.Printf("值:%d\n", slice[i])
}
复制代码

注意点

  1. 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
}
复制代码

注意点

  1. 传递复制切片时, 底层数组不会被复制, 也不会收影响, 复制只是复制的切片本身, 不涉及底层数组

转载于:https://juejin.im/post/5b6911e2518825018c4d0a91

Go中的切片Slice相关推荐

  1. 在pythonnumpy中切片(slice)

    转载自:博客 在python&numpy中切片(slice) 上文说到了,词频的统计在数据挖掘中使用的频率很高,而切片的操作同样是如此.在从文本文件或数据库中读取数据后,需要对数据进行预处理的 ...

  2. golang中的切片

    slice 注意,切片代表的窗口是无法向左扩展的 顺便提一下把切片的窗口向右扩展到最大的方法.对于s4来说,切片表达式s4[0:cap(s4)]就可以做到 一个切片的容量可以被看作是透过这个窗口最多可 ...

  3. 切片slice(python)

    切片slice 作用:从容器中取出相应的元素重新组成一个容器. 语法:容器[(开始索引):(结束索引)(:(步长))] 小括号()括起的部分代表可省略 说明: 结束索引不包含该位置元素 步长是切片每次 ...

  4. 位置2的索引超出数组范围不能超过10_golang学习笔记--切片slice 与数组 arr

    因为我是写php的,刚开始写go的时候老是被数组坑.因为在go中的数组是固定长度,所以会存在越界的时候.而在go中也很少直接使用数组.更多的时候会使用slice(切片). 数组 数组是一个由固定长度的 ...

  5. golang中的切片及内存拷贝

    十分钟讲明白, golang, Go 语言切片(Slice) 2017年08月21日 16:39:21 kingmax54212008 阅读数:8782 https://blog.csdn.net/k ...

  6. 切片 go 去除第一个_golang学习笔记--切片slice 与数组 arr

    因为我是写php的,刚开始写go的时候老是被数组坑.因为在go中的数组是固定长度,所以会存在越界的时候.而在go中也很少直接使用数组.更多的时候会使用slice(切片). 数组 数组是一个由固定长度的 ...

  7. 【Go】Go 语言切片(Slice)

    文章目录 一.切片 二.声明切片 方法1 方法2 总结:创建切片的各种方式 三.切片初始化 1. 声明的同时初始化 2. 用数组初始化切片 3. 切片的内存布局: 读写操作实际目标是底层数组,只需注意 ...

  8. 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.数组 ...

  9. python切片是什么意思_python中的切片是什么?(实例解析)

    在以下的文章之中我们来了解一下什么是python中的切片.了解一下python中的切片是什么意思,以及切片在python之中能起到什么样的作用. 取一个list或tuple的部分元素是在python编 ...

  10. Golang 入门 : 切片(slice)

    切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数 append( ...

最新文章

  1. OpenCASCADE Make Primitives-Sphere
  2. 卡巴斯基授权许可文件_安全许可证的申请流程有哪些?
  3. 文档null一段 虚拟机操作
  4. php图片生成缩略图_PHP实现生成图片缩略图函数
  5. 博图如何读取mysql数据_博途使用小结:从SQL中读取数据并给变量赋值
  6. Ability的基本概念(2)
  7. Node.js模块之Buffer
  8. java 向父类_Java基础——面向对象(Object父类)
  9. python实现一个数如果恰好等于它的因子之和,这个数就称为“完数” 。例如, 6的因子为 1、2、3,而 6=1+2+3,因此 6 是完数。编程找出1000之内的所有完数
  10. 揭露一种通过网络实施ATM诈骗的手段!
  11. Nginx增加第三方外部插件
  12. HDU 2609 最小表示法
  13. 调用赋码远程服务异常_Remoting远程访问的这个异常怎么处理???
  14. 一文教会你使用 Neo4j 快速构建明星关系图谱
  15. 丽江旅游线路规划丽江游玩小贴士丽江游玩攻略花费
  16. 电脑小鸟壁纸怎么彻底删除?
  17. 艾草减肚子方法非常有效 赛乐赛骗局是真的吗
  18. python爬虫教程下载-Python网络爬虫从入门到精通 PDF 下载
  19. 二手交易APP开发主要功能有哪些?(二)
  20. ​K歌中的歌唱评价与嗓音分析

热门文章

  1. h5红包雨代码_【多管闲事】非专业人士H5学习指北:从门还没入到放弃 | 叙一来闲...
  2. solr html显示,在SOLR中,如何执行索引. html 文件_solr_开发99编程知识库
  3. linux qt读取显示图片,QT学习篇(二) 使用QPixmap显示一张图片
  4. Android的JNI【实战教程】3⃣️--Java调用C代码
  5. 怎么用计算机excel计算矩阵,怎样用EXCEL进行矩阵计算?
  6. mysql更改密码_Mysql更改密码、连接mysql、mysql常用命令
  7. C语言substr函数用法,自己实现substr函数——C语言
  8. sql developer下载_开放下载!《Rocket MQ 使用排查指南》精解100+常见问题
  9. java中堆 栈的英文_Java中的栈和堆
  10. java案例代码9-冒泡算法: