因为我是写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之后每次扩容增量为四分之一

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

期待一起交流

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

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

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

  2. ES6基础2(块级作用域、数组对象解构)-学习笔记

    文章目录 ES6基础2(块级作用域.数组对象解构)-学习笔记 块级作用域 数组解构 对象解构 字符串解构 函数的参数解构 ES6基础2(块级作用域.数组对象解构)-学习笔记 块级作用域 //let c ...

  3. php 数组大于1,位置 1 的索引超出数组范围(不能超过 1)。

    %清空运行环境 clc clear %速度更新参数 c1 = 1.49445; c2 = 1.49445; maxgen = 300; %最大迭代次数 sizepop = 20; %种群规模数 %个体 ...

  4. MATLAB位置1无法索引,位置 1 的索引超出数组范围(不能超过 1)

    clear clc; N=512; L=512; f1=300;fs=15000; T=1/fs; ws=2*pi*fs; t=(0:1:N-1)*T; x=sin(2*pi*f1*t); y=fft ...

  5. 渡一教育公开课web前端开发JavaScript精英课学习笔记(十)数组的常用方法

    数组的常用方法(ES3) 以ES3.0为基础,ES5.0 在ES3基础上扩展,ES6.0 在ES5基础上扩展. 改变原数组的方法: push.pop.shift.unshift.sort.revers ...

  6. Go 学习笔记(10)— 数组定义、数组声明、数组初始化、访问数组、数组相等、向函数传递数组

    1. 数组定义 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 2. 声明数组 Go 语言数组声明需要指定元素类型及元素个数,语 ...

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

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

  8. Java学习笔记(九)--数组及Arrays类

    数组 数组是最为常见的一种数据结构,是相同类型的.用一个标识符封装到一起的基本类型数据序列或对象序列. 数组是具有相同数据类型的一组数据的集合.就是说数组中的每个元素具有相同的数据类型.在Java中将 ...

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

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

最新文章

  1. Possion 分布
  2. 超全 Python IDE 武器库大总结,优缺点一目了然!
  3. LeetCode - 695. Max Area of Island (Java)
  4. java如何做数据归档_oracle数据库的归档方式
  5. 自然语言处理一大步,应用Word2Vec模型学习单词向量表征
  6. ASP.NET Core 2.0使用Autofac实现IOC依赖注入竟然能如此的优雅简便
  7. 从零开始的全栈工程师——html篇1
  8. 【汇编基础】SIMD除法的实现
  9. python环境准备_一键实现Python环境准备
  10. 【编辑器】常用编程环境使用感受20190804
  11. 无法连接 Plugins Market 失效的日子
  12. Rust: Operations with sequence
  13. centos7 Rsync服务端和windows cwRsync实现数据同步(增量备份)
  14. win10系统如何设置win11开机音效的方法
  15. 【Paper Quickthrough】2021 Bert 各向异性
  16. 精要主义设计人生——对混乱的工作说不
  17. MPLS 网络技术 — 组网方案
  18. iOS设置启动页并适配机型
  19. MySQL 5.5.20 中文乱码:我的抗争解决史
  20. 直播美颜sdk免费版有吗?为什么美颜sdk没有免费版?

热门文章

  1. C语言--第2次作业
  2. 现代操作系统第三版高清.pdf中文版免费下载
  3. Map集合HashMap,TreeMap
  4. HTML基础 DOM概览(第一天)
  5. UI: 自定义 UISegmentedControl
  6. 递推(hdu2563)
  7. 提升速度与精度,FedReg: 减轻灾难性遗忘加速联邦收敛(ICLR 2022)
  8. 自动驾驶场景解析:图像分割开发实战
  9. ResNet及其变种的结构梳理、有效性分析与代码解读(PyTorch)
  10. python中单下划线(_)和双下划线(__)的特殊用法 还等什么