Go学习笔记-数组和切片

数组

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列(同构的数据结构);这种类型可以是任意的原始类型,例如整型、字符串或者自定义类型。

数组长度必须是一个常量表达式,并且必须是一个非负整数。

数组成都也是数组类型的一部分,所以[5]int和[10]int是属于不同类型的。

数组是一种值类型。

数组的编译时,值初始化时按照数组顺序完成的

知识扩展:1.PHP中的数组实际上是一个有序映射。映射是一种把values关联到keys的类型;2.C语言中的数组是指向首元素的指针

声明的格式:var identifier [len]type。例如: var arr1 [5]int。

数组的特点:
  • 这种类型可以是任意的原始类型,例如整型,字符串,自定义类型。
  • 数组长度必须是一个常量表达式,并且是一个非负数
  • 数组长度也是数组类型的一部分
数组长度的特点:
  • 数组索引从0开始
  • 元素的数目,也称为长度或者数组大小必须是固定的并且在声明该数组时就给出
  • 数组长度最大为2Gb

 备注:Go语言中的数组是一种值类型(C/C++中是指向首元素的指针)。Go中的数组可以用new()来创建:var arr1 = new([5]int),这种方式创建出来的数组arr1的类型是*[5]int,而arr2的类型是[5]int。当把数组作为参数传给函数是,会产生一次赋值,函数就不会修改原始数组。

arr1 := new([3]int)
arr2 := arr1
arr2[1] = 23
fmt.Println(arr1[1]) // 结果为23,因为arr1的类型是*[3]int
 数组的变化形式
1 var arr1 = [5]int{1,2,3,4,5} // 也是写成[5]int{1,2}其他位置的值默认0
2 var arr2 = [...]int{1,2,3,4,5} // 从技术上说变成了切片
3 var arr3 = [5]string{2:'kobe',3:'paul'} // 索引23被赋值

 切片

切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片时一个引用类型。

声明切片的格式是:var identifier []type (备注:不需要说明其长度

切片在未初始化之前为nil,长度为0。

切片的特点

  • 切片可以是整个数组,或者是由其实和终止索引标识的一些项的子集(备注:终止索引标识的项不包括在切片内)
  • 切片时可索引额,并且可以由len()函数获取长度
  • 切片可以在运行时修改,最小为0最大为相关数组的长度(备注:切片可以理解成长度可变的数组,但这么说本质上是不对的,形式上是)
  • 切片提供了计算容量的函数cap()可以测量切片最长可以达到多少。强调:切片长度永远不会超过其容量(备注:容量的它所在数组的长度)
  • 因为切片是一个数组中的一部分,也就是说一个数组可以有多个切片,那么这些切片就是共享这个数组的数据。
  • 切片是引用类型,所以不需要额外的存储空间,因此比数组的效率高

切片的创建

var slice1 = []int{1,2,3,4} // 创建了一个长度为4的数组,并创建了一个相关切片
var slice2 = make([]int,5) // make([]type,len,cap)(cap可选参数)
var slice3 = new([]int) // slice3=nil,切片没有被初始化,make()创建的会直接初始化。

切片的原理

  在内存中是一个3个域的结构体:指向相关数组的指针,切片长度及切片容量。

  

使用make生成切片的原理

  方式 var slice1 := make([]type,len,cap)  参数分别是切片类型,切片长度,切片容量。cap参数可选,如果忽略的话,默认创建的切片len=cap

1 //这两种方法生成相同的切片,切片是引用类型,所以他们类型也是相同的 
2  make([]int,50,100)
3  new([100]int)[0:50]

  make()方法生成的切片的内存结构

  

原文地址:https://www.cnblogs.com/ymkfnuiwgij/p/8660071.html