You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
3.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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