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

数组

数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。数组的长度是固定的。和数组对应的类型是Slice(切片),它是可以增长和收缩动态序列,slice功能也更灵活,但是要理解slice工作原理的话需要先理解数组。

数组的声明,需要指出数组内部元素类型,以及数组的长度

var  name [len]type

如:声明一个长度为5的Int 类型数组

var numbers [5]int

数组元素的访问也是跟大多数语言一样,可以通过索引下标来访问,索引下标的范围是从0开始到数组长度减1的位置。内置的len函数将返回数组中元素的个数。 下面是一些数组的简单操作

func main() {var arr [3]int //声明一个长度为3的数组//往数组中增加元素arr[0] = 1arr[1] = 2arr[2] = 3// arr[3] = 1  这里就会产生错误//在声明数组的时候复制var addArr = [3]int{1, 2, 3}fmt.Println(addArr[0]) //moreArr := [...]int{1, 2} //这里...表示不确定长度。最终数组的长度由实际的元素个数确认fmt.Println(moreArr[0])   ////数组的使用for k, v := range arr {fmt.Printf("第%d个元素为%dn", k+1, v)}}

切片

slice是一个轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能,slice的底层引用了一个数组对象。一个slice由三个部分构成:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素并不一定就是数组的第一个元素。长度对应slice中元素的数目;长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。

func main() {arr := [5]int{1, 2, 3, 4, 5} //定义一个数组sle1 := arr[0:2]             //切片1sle2 := arr[1:3]             //切片2sle1[0] = 9                  //现在改变第一个切片的第一个元素fmt.Println(arr)             //[9 2 3 4 5]fmt.Println(sle1)            //[9 2]fmt.Println(sle2)            //[2 3]/*** 现在改变两个切片共有的元素,通过结果可以看到* 底层数组 以及sle2中的一个元素都以及被改变了。* 可以很好的说明 切片是对数组的引用。两个切片实际引用的是同一个底层数组**/sle1[1] = 10fmt.Println(arr)  //[9 10 3 4 5]fmt.Println(sle1) //[9 10]fmt.Println(sle2) //[10 3]}

上面的例子说明切片的第一个构成部分是指向底层数组的指针,下面来看看容量跟长度。 内置的len和cap函数分别返回slice的长度和容量。

func main() {arr := [5]int{1, 2, 3, 4, 5}sli := arr[:4] // [1,2]fmt.Printf("切片长度为%d,容量为%dn", len(sli), cap(sli))//切片长度为4,容量为5sl2 := arr[:2] // [1,2]fmt.Printf("切片长度为%d,容量为%dn", len(sl2), cap(sl2)) //切片长度为2,容量为5sl3 := sli[:6] //这里会产生panic range of index。因为超过源切片的容量}

这里我们可以看到,如果切片操作超出cap(s)的上限将导致一个panic异常,但是超出len(s)则是意味着扩展了slice,因为新slice的长度会变大。那么我们应该怎么去给切片扩容呢,这里我们需要用到append方法、看下面的例子

func main() {/*** 这里使用make 创建一个切片  * make([]T, len, cap) 其中cap可以省略。默认为Len*/sli := make([]int, 1, 1) fmt.Printf("切片长度为%d,容量为%dn", len(sli), cap(sli)) //2for i := 1; i < 5; i++ {sli = append(sli, 2)fmt.Printf("切片长度为%d,容量为%dn", len(sli), cap(sli)) //2}}
输出结果
切片长度为1,容量为1,地址为0xc00005a420
切片长度为2,容量为2,地址为0xc00005a420
切片长度为3,容量为4,地址为0xc00005a420
切片长度为4,容量为4,地址为0xc00005a420
切片长度为5,容量为8,地址为0xc00005a420

通过上面例子可以看出,当切片长度大于当前容量的时候,会为当前切片自动扩容。每次扩容的大小为当前容量的2倍,但是当容量超过1024之后每次扩容增量为四分之一

数组跟切片的基本就到这了。还没有入门,学习中。有错误的地方欢迎指出。

期待一起交流

切片 go 去除第一个_golang学习笔记--切片slice 与数组 arr相关推荐

  1. python input 拖入路径 去除转义 空格_python学习笔记(基础-2)(转载)

    1.输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字. 2.输入 如果要让用户从电脑输入一些字符怎么办?Python提供了一个input(),可以让用户输入字符串,并存放到一个变 ...

  2. kail中tools的安装和第一个php学习笔记

    安装tools 打开 鼠标右击选择 创建文件夹 mkdir cdrom 把tools文件复制到 位置--计算机--cdrom文件夹下 打开 cdrom cd cdrom 复制生成的目录 解压文件夹:t ...

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

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

  4. go语言学习笔记(5)数组与切片

    数组与切片 1.数组与切片的相同以及不同点 它们都属于集合类型,它们的值都可以用来存储某一种类型的值,但是数组类型的值的长度是固定的,而切片类型的值是可变长的.数组的长度在声明它的时候必须给定并且以后 ...

  5. JavaScript学习笔记(三)——数组

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  6. JavaScript学习笔记(六)--数组

    数组初始化 我们都知道,数组是用于保存多个值的集合,在数组中,值被称为元素,值可以是任意的数据类型.在Javascript中,创建数组通常有两种方式:字面量和构造函数. 字面量 数组的元素可以是任意的 ...

  7. [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树

    可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ...

  8. Java学习笔记2.6.2 数组 - 二维数组

    文章目录 零.本讲学习目标 一.引入多维数组的场景 二.二维数组的定义 (一)指定二维数组行数与列数 (二)指定二维数组行数,不指定列数 (三)直接使用嵌套大括号"{}"静态初始化 ...

  9. “模板”学习笔记(7)-----数组模板+对象数组举例

    我们可以定义一个数组模板,并且利用该模板声明其数组成员.声明的方式非常简单,主需要一下两步: template<class ElementType,int n>; ElementType ...

最新文章

  1. LSGO代码小组第18周复盘日志
  2. scipy.sparse.coo_matrix、csr_matrix、lil_matrix、dia_matrix
  3. ThinkPHP分页实例
  4. 埃维诺任命杰出企业家郭秀闲掌舵大中华区业务
  5. python函数的返回值是返回引用吗_python-函数(上):函数返回值、函数调用、前向引用...
  6. 一个初学者的SAP Cloud Platform学习笔记
  7. 采用config方式灵活配置我们的Quarz.net中的Job,Trigger
  8. mysql 导入导出大文件
  9. 【车间调度】基于matlab粒子群算法求解车间调度问题【含Matlab源码 013期】
  10. VC 2015 x86的DLL绿色包(QT 5.6)
  11. Java-封装继承多态
  12. c语言编程如何进行n次方运算,c语言n次方怎么输入?_后端开发
  13. C++ control reaches end of non-void function [-Werror=return-type]
  14. python话费充值_手机话费充值接口开发指南(含API文档,充值移动、联通、电信话费)...
  15. Openlayers设置请求瓦片大小
  16. Windows系统下的CMD Route路由配置
  17. 如何从iTunes Store赠送音乐,电影等
  18. GBase 8s 块(chunk)
  19. 公共基础知识:什么是“商品”
  20. debian安装MySQL

热门文章

  1. Redis持久化-RDB
  2. 系统更新链接服务器超时,win10系统更新导致Dr.com连接认证服务器超时的解决方法...
  3. 循环取矩阵的某行_一文搞懂RNN(循环神经网络)基础篇
  4. 【VS】项目属性配置(中)
  5. SQL Server 中系统表的作用
  6. 免费2款标注工具实操(内含下载链接)
  7. tensorflow中的global_step参数(转)
  8. flow control
  9. Kafka与.net core(一)安装
  10. CF 246E. Blood Cousins Return [dsu on tree STL]