|
|
# 一、数组
|
|
|
和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()
|
|
|
复制切片
|