Go语言中的数组与数组切片

Go中的数组与C的数组一样,只是定义方法不同

c: int a[10][10]

Go [10][10]int

定义并初始化 array1 := [5]int{1,2,3,4,5}

变量名 := [index]类型{也可不加}

1.元素访问:1.跟C语言一样通过数组来访问

   2.通过关键字range来访问 如:for i,v :=range array{

                  fmt.Printlb(*Array element[",i,"]=*,v)

                 }第一个表示下标从0到len(array)-1

2.值类型:需要注意的是数组是一个值类型。所有的值类型变量在赋值和作为参数传递的时候都将进行一次复制,会将副本传递过去。所以函数体中无法通过修改传入的数组内容来改变数组。

3.函数切片:函数切片的数据结构可以抽象为以下三个变量

    {1.一个指向原生数组的指针;

     2.数组切片中的元素个数;

     3.数组切片已分配的存储空间。

}基于数组,数组切片添加了一系列管理功能,可以随时动态地扩充存放空间,并且可以被随意传递而不会导致所管理的元素被重复复制。

创建数组切片:

  1.根据基础数组创建(有原数组):

    数组切片可以只使用数组的一部分元素或者整个数组来穿件,甚至可以创建一个比原数组还要大的数组切片。

    支持用mySlice := myArray[first:last]  这种方式来生成数组切片 //同C语言一样是从first到last-1位序列开始。myArray[ : ]表示全部。

   2.直接创造:

    使用Go语言提供的内置函数make()可以用来灵活地创建数组切片如:

      mySlice1 := make([ ]int,5)  //创建了一个有5个初始元素且初始值为0的数组切片

      mySlice2 := make([ ]int,5,10)//同上增加了留十个元素的存储空间

      mySlice3 := [ ]int{1,2,3,4,5}//直接创建并初始化元素的数组切片

    自我归纳:1.make函数可以初始切片并赋值为0和预留存储空间

         2.直接数组切片赋值不用添加make  如 Slice = [ ]类型{}

2.遍历数组和数组切片:

 1.跟C语言一样通过index访问

 2.使用range函数快速遍历:

    for i,v in range array{

      i为返回值的索引,v为返回元素的值//第一个返回索引,第二个返回元素值

3.动态增减元素:

可动态增减元素是数组切片比数组更强大的功能。数组切片多了一个存储力(capacity)的概念=元素个数和分配的空间不同。可以大幅度降低数组切片内部重新分配内存和搬送内存快的频率,大大提高程序性能。因为如果内存大于了原设定的内存,需要CPU重新整一个更大的内存并把原来存储的东西移到新整的内存上面。且CPU并不知道更大为多大所以需要CPU处理多次。

在此种有Go语言内置函数cap()和len()函数,cap()函数返回的是数组切片的预留空间大小,len()函数顾名思义返回的是已有元素个数。

   如果需要在数列切片中已包含的元素后继续新增元素,可以使用append()函数跟python的比较类似。如:

  mySlice = append(mySlice,1,2,3)  //append()函数的第二个参数其实是一个不定参数,可以自己随意添加若干个元素,甚至于将一个数组切片追加到另一个数组切片末尾:

      mySlice2 := [ ]int{1,2,3}

      mySlice = append(mySlice,mySlice2...)//但是后面需要有省略号,因为在append()函数中从第二个参数起所有的参数都是待附加参数。加上省略号相当于把mySlice2打碎了传入    mySlice = append(mySlice,1,2,3)

      数组切片会自动处理存储空间不足的问题。如果追加的内容长度超过当前已分配的存储空间(既大于cap()的返回值),数组切片会自动分配一个足够大的内存。

4.基于数组切片创建数组切片:

如 oldSlice :=[ ]int{1,2,3,4,5}

  newSlice :=oldSlice[ : 3] //跟基于数组来创建数组切片[first:last]

 //newSlice可以创建oldSlice包含的元素,只要不超过oldSlice的cap()函数返回值,超过元素的部分初始化为0

5.内容复制:

数组切片支持Go语言的内置函数copy(),用于将内容从一个数组切片复制到另一个数组切片。如果加入的数组切片不一样大,就会按其中较小的你数组切片的元素个数进行复制

slice1 := []int{1, 2, 3, 4, 5}
  slice2 := []int{6, 7, 8}
  copy(slice1, slice2)//把slice2复制到slice1,但是由于slice2的数量小于slice1所以有多少复制多少

copy(slice2,slice1)//把slice1复制到slice2,由于slice1数量大于slice2,则只复制前三到slice2

相关推荐