GO语言基础语法3 | 青训营笔记

61 阅读2分钟

go中的array类似c++中的定长数组,长度是不可变的,定义时确定,可以用var arr [n]type来定义,即长度为n的类型为type的数组arr,数组下标也是从0开始,与c++类似。

数组作为参数传入函数时与c++有所不同,c++中的数组会退化为指针(sizeof函数不会退化),而go的数组不会退化,传入函数的是数组的副本而不是指针。

数组声明也可以用:=,arr:= [n]type{a,b,c}即定义了一个长为n的type类型的数组,初始装有a,b,c三个元素。可以省略n,换为...,go会自动计算数组长度。

go也支持多维数组,声明可以用arr:=[n][m]type{[m]type{a,b,c},[m]type{d,e,f}},简短声明是arr:=[n][m]type{{a,b,c},{d,e,f}},省略内部长度和类型。

在需要使用动态长度的数组时,可以用go中的slice,但他不是真正意义的vector,而是一个动态数组的引用,声明方式为var arr []type、要初始化为大括号内的元素则可以arr:=[]type{...}。

和python中的slice有些类似,go中的slice可以使用类似[n:m]的方式从另一个数组或者slice中获取元素并声明,即arr[i:j]的方式,这样新的slice中有arr中[i,j)的元素,左闭右开。若i不写,则默认为0,j不写,则默认为源数组的长度。

slice也有很多内置函数,如len函数返回slice的长度;cap返回slice的最大容量(这里类似c++的vector,size<=capacity);append可向此slice中追加多个元素,返回更新后的slice(当slice空间不足时,也会像vector一样动态扩容,返回的slice是这个新空间,而源slice不做改变;当空间充足时则源slice和返回的slice都改变了,其他引用的slice也改变了);copy函数从源slice中复制元素到目标slice,并返回复制元素的格式。

若使用slice:=arr[i:j:k]的形式定义,则会指定此slice的容量为k-i,同样的,i不写则默认为0。