数组与切片
1.数组与切片的相同以及不同点
它们都属于集合类型,它们的值都可以用来存储某一种类型的值,但是数组类型的值的长度是固定的,而切片类型的值是可变长的。数组的长度在声明它的时候必须给定并且以后不会再改变,数组的长度是其类型的一部分[1]string 和[2]string就是两个不同的数组类型;而切片的类型字面量中只有元素类型,切片的长度随着元素的增加而增加,但不会随着元素的减少而减少。可以把切片看做数组的一层简单的封装,因为切片的底层数据结构中是一个数组,而切片可以看做对数组某个连续片段的引用。
所以Go语言的切片类型属于引用类型,同属引用类型的还有map类型,chan类型,func类型;而Go语言的数组类型则属于值类型,同属值类型的还有基础数据类型以及结构体类型,这里有不同的不必担心,后续都会讲到。
通过内建函数len,可以的到它们的长度。通过内建函数cap,可以得到它们的容量。数组的容量大于其长度,而且是不可变得。而切片的容量的变化是有规律的。
2.怎样正确估算切片的长度和容量
例子:
package main
import (
"fmt"
)
func main() {
a := make([]int, 5)
fmt.Println(len(a))
fmt.Println(cap(a))
fmt.Println(a)
b := make([]int, 5, 8)
fmt.Println(len(b))
fmt.Println(cap(b))
fmt.Println(b)
}
切片a和切片b的容量分别是5,8
问题解析:
用make初始化切片时,如果不指明容量,那么它就会和长度一致,如果指明了容量那么切片的实际容量就是指明的容量。
容量就相当于底层数组的长度。而长度就相当于一个窗口,一个能看到底层数组一部分连续元素的窗口,例如b的长度为5,那切片b能够看到底层数组的[0,4]的元素,现在切片b的最左边的元素就相当于底层数组的最左边元素。
但是通过切片表达式基于某个数组或切片生成新切片的时候,就不一样了。
例子:
c := []int{1, 2, 3, 4, 5, 6, 7, 8}
d := c[3:6]
fmt.Println(len(c))
fmt.Println(cap(c))
fmt.Println(c)
fmt.Println(len(d))
fmt.Println(cap(d))
fmt.Println(d)
此时c 的长度容量都为8但是d的长度为3容量为5
解析,首先长度很容易理解,它们有多少个元素长度即为多少。在前面说过切片的容量代表了底层数组的长度,但这仅限于使用make函数或者切片值字面量初始化切片的情况。更通用的规则是:一个切片的容量可以看作是透过这个窗口最多可以看到底层数组中元素的个数。
由于s4是在s3上施加切片操作的来的,所以s3的底层数组就是s4的底层数组。又因为在底层数组不变的情况下,切片代表的窗口可以向右扩展,一直到数组的末尾,所以s4的容量就是其底层数组的长度8减去上述切片表达式中的那个起始索引3,所以d的容量是5,可以通过d[0:cap[d]]的方式向右扩展最大化.
3.怎样估算切片容量的增长
一旦一个切片无法容纳更多元素,Go语言就会想办法扩容。但它不会改变原来的切片,而是会生成一个更大容量的切片,然后将原有元素和新元素一起拷贝到新切片中。
一般情况下,新切片容量将会是原切片容量的2倍,但是原切片长度大于1024时,Go语言将会以原容量的1.25倍作为新容量的基准。如果我们一次追加的元素大于了原容量的两倍,那么新容量就会以新长度为基准。
4.切片的底层数组何时被替换
一个切片的底层数组永远不会被替换。切片在扩容时Go语言会生成新的底层数组,但它也同时生成了新的切片。它把新的切片作为新底层数组的窗口,对原切片的底层数组不会做任何改动,只要新长度不会超过切片的容量,append就不会引起扩容。只会替换底层数组中紧临切片窗口后边的元素,不扩容代表着append返回的是指向原底层数组的新切片,扩容时才会返回指向新底层数组的新切片。
注意,当两个切片指向的同一个底层数组时,当其中一个切片扩容后,两者指向的就不是同一个底层数组了。同时当两个切片指向同一个底层数组时,改变其中一个切片的值会影响到另一个切片的值,这种问题可以通过copy函数来解决

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

go语言学习笔记(5)数组与切片相关推荐

  1. c++ map是有序还是无序的_go 学习笔记之数组还是切片都没什么不一样

    上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特 ...

  2. c语言数组与指针的基础知识,C语言学习笔记之数组与指针的关系

    首先,大家先需知道一个关于基类型的概念 基类型:组成一个新类型的基础类型 这句话是什么意思呢?举个例子: int a[3] = {1,2,3}; 上面是由三个int类型的数组成一个新的类型也就是数组, ...

  3. 【numpy学习笔记】数组的切片,索引,迭代

    1. 一维数组 切片 a = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])a[5] # 5a[2:6] # array([2, 3, 4, ...

  4. C语言如何加缓冲,C语言学习笔记之输出缓冲

    在c语言中经常用到输出函数printf,当我们像往常一样在输出函数中输入我们的想要的输出的东西后加\n换行 验证结果如我们输出的一样 如果我们在后面加入死循环会不会出现这些语句呢 结果卡死了,可还是输 ...

  5. Go语言学习笔记-数组、切片、map

    Go语言学习笔记-数组.切片.map 数组:同一数据类型元素的集合.是值类型,长度固定无法修改 声明格式:var 数组名字 [元素数量] 数据类型 var arr [3] int //声明定义了一个长 ...

  6. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  7. C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)

    C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址.   取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符   地址的大小 ...

  8. C语言学习笔记09-数组、字符数组、字符串数组、二维数组(单字符输入输出putchar、getchar,字符串输入输出的scanf、gets、puts)

    C语言数组   数组作用:可以用来保存很多记录(可以看成一种大容器).一些简单游戏也基本由数组实现,如游戏地图(二维数组)等等.   一个数组 划分 多个单元(下标区分) -存放-> 多个同类元 ...

  9. go get 拉取指定版本_go语言学习笔记-基础知识-3

    相关文档 go语言学习笔记-目录 1.简介 1.1 什么是GO Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易.Go是从2007年末由Robert Griesemer, Rob ...

  10. 【Go语言 · 学习笔记】

    文章目录 Go语言 · 学习笔记 一.Go包管理 1. 什么是Go语言中的包 2. 包的命名 3. main包 4. 导入包 5. 远程包导入 6. 命名导入 7. 包的init函数 二.Go开发工具 ...

最新文章

  1. 【Leetcode | easy】反转整数
  2. this指针_C++:07this指针
  3. 查看云服务器系统的命令,查看云服务器系统的命令
  4. 牛x!一款比传统数据库快 100-1000 倍的数据库,来认识一下?
  5. 只安装oracle服务端连plsql,Oracle 不安装Oracle客户端,使用PLSQL连接Oracle服务器
  6. Raspberry Pi 的新用法:检测家中的漏水情况
  7. python学习笔记(14)参数对应
  8. 求最大公约数的4种常用算法
  9. [生存志] 第108节 李斯划分三十六郡
  10. Node实现支付宝网页支付流程(沙箱环境)
  11. 教师-学生网络下Self-Ensembing with GAN-based Data Augmentation for Domain Adaption in Sematic Segmentation
  12. 计算机显卡驱动全部卸载,Win7彻底卸载NVIDIA显卡驱动程序的办法
  13. RGB转CMY最简单的方法
  14. 使用python实现自动爬取得物交易记录,商品信息进行数据分析
  15. python的requests.get()方法获取百度搜索结果页面失败的问题
  16. Android 11.0 自定义仿小米全面屏手势导航左右手势滑动返回UI效果
  17. python绘制对数函数_python中如何画对数函数图?
  18. 1.Windows环境配置
  19. 如何快速查看bili上的视频学习
  20. Aws S3 基础操作

热门文章

  1. Java编程ture找不到符号,为什么会出现这样的错误呢
  2. linux触摸屏代码解析,Linux触摸屏驱动解析
  3. 赫夫曼树的定义及原理
  4. 剑指offer面试题[51]-数组中重复的数字
  5. 亲密关系--【承担情绪】-如何让对方的情绪软着陆
  6. 又来?软件测试之接口自动化面试题汇总
  7. 压力测试实践一:JMeter + JProfiler 入门
  8. android触屏设备event模拟,android 使用命令模拟点击 滑动
  9. 如何 调系统相机_神仙理光相机,各种静物原片直出也太美了吧!!!
  10. ad09只在一定范围内查找相似对象_重磅!Excel更新了超级查找函数XLOOKUP,可以对VLOOKUP说拜拜了...