# 一、数组 和java、python数组类似,使用[]来表示 ``` var identifier [len]type ``` 表示声明一个长度为5的数组,下标从0开始且长度不可变 ```go var a [5]int ``` 表示声明一个数组,并初始化4个值,与 var a =[4]string{"a", "b", "c", "d"} 相同,用于数组常量 ```go a := [...]string{"a", "b", "c", "d"} ``` 数组常量 ```go //初始10位数组,除前3位外都是0 var arrAge = [10]int{18, 20, 15} var arrLazy = [...]int{5, 6, 7, 8, 22} var arrLazy = []int{5, 6, 7, 8, 22} //根据下标指定值 var arrKeyValue = []string{3: "Chris", 4: "Ron"} ``` ## 1.1 数组遍历 第一种: ```go func main() { var a [10]int for i := 0; i < len(a); i++ { a[i] = i * 2 } //遍历 for i := 0; i < len(a); i++ { println(a[i]) } } ``` 第二种: ```go func main() { var a [10]int for i := 0; i < len(a); i++ { a[i] = i * 2 } //for-range遍历,第一个返回值 ix 是数组或者切片的索引,第二个是在该索引位置的值;value 只是 slice1 某个索引位置的值的一个拷贝,不能用来修改 slice1 该索引位置的值。 for ix,value := range a { println(a[ix]) } //也可以只要索引 for ix := range a { println(a[ix]) } } ``` # 二、切片 切片可以理解为动态数组,是**引用类型**,与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。可以理解为java中的list 声明一个切片的格式,不需要写长度 ```go var identifier []type ``` 数组转切片,有点类似python ```go var slice1 []type = arr1[start:end] ``` ## 2.1 切片初始化 ```go var slice1 []type = make([]type, len) //也可以简写为 slice1 := make([]type, len) //也可以指定容量,其中capacity为可选参数 make([]T, length, capacity) ``` ```go ////直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3 s :=[] int {1,2,3 } //初始化切片s,是数组arr的引用 s := arr[:] //将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片 s := arr[startIndex:endIndex] //缺省endIndex时将表示一直到arr的最后一个元素 s := arr[startIndex:] //缺省startIndex时将表示从arr的第一个元素开始 s := arr[:endIndex] //通过切片s初始化切片s1 s1 := s[startIndex:endIndex] //通过内置函数make()初始化切片s,[]int 标识为其元素类型为int的切片 s :=make([]int,len,cap) ``` ## 2.2 切片截取 与python方式相同 ```go s :=[] int {1,2,3 } //表示从第1个元素开始截取,结果为2、3 s1:=s[1:] ``` ```go s := []int{1, 2, 3, 4, 5, 6, 7} //表示从第1个元素开始截取,不包含第3个元素,结果为2、3 s1 := s[1:3] ``` ## 2.3 append()和copy() 向切片追加元素 ```go var numbers []int printSlice(numbers) /* 允许追加空切片 */ numbers = append(numbers, 0) printSlice(numbers) /* 向切片添加一个元素 */ numbers = append(numbers, 1) printSlice(numbers) /* 同时添加多个元素 */ numbers = append(numbers, 2,3,4) printSlice(numbers) /* 创建切片 numbers1 是之前切片的两倍容量*/ numbers1 := make([]int, len(numbers), (cap(numbers))*2) /* 拷贝 numbers 的内容到 numbers1 */ copy(numbers1,numbers) printSlice(numbers1) ``` ## 2.4 copy() 复制切片