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
原文地址:https://www.cnblogs.com/beautiful7/p/12355242.html