Go 语言提供了数组类型的数据结构。
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。
数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。数组的下标取值范围是从0开始,到长度减1。
数组一旦定义后,大小不能更改。
一、数组定义
需要指明数组的大小和存储的数据类型。
var 数组变量名 [元素数量]T
var arr[5]int //定义一个int类型长度为5的数组
二、数组初始化
数组的初始化有三种方法。
1、使用指定的值完成初始化
var numArry = [3]int{1, 2, 3}
var cityArry = [3]string{"北京", "上海", "深圳"}
2、根据初始值的个数自行推断数组的长度
var numArry = [...]int{1, 2, 3}
var cityArry = [...]string{"北京", "上海", "深圳"}
3、使用指定索引值的方式来初始化数组
numArry := [...]int{0: 1, 2: 3} //[1 0 3]
var cityArry = [...]string{0: "北京", 1: "深圳"} //["北京" "" "深圳"]
三、数组的遍历
数组的长度:len(arr)
可以得到数组的长度
数组的遍历可以用for循环或for range循环
arr := [...]int{1, 2, 3}
for i := 0; i < len(arr); i++ {
fmt.Println(i, arr[i])
}
arr := [...]int{1, 2, 3}
for k, v := range arr {
fmt.Println(k, v)
}
运行结果
0 1
1 2
2 3
四、多维数组
Go语言是支持多维数组的,我们这里以二维数组为例(数组中又嵌套数组)。
arr1 := [2][3]int{
{1, 2, 3},
{4, 5, 6},
}
arr2 := [2][2]string{{"北京", "上海"}, {"苏州", "无锡"}}
fmt.Println(arr1)//[[1 2 3] [4 5 6]]
fmt.Println(arr2)//[[北京 上海] [苏州 无锡]]
注意: 多维数组只有第一层可以使用...
来让编译器推导数组长度。
多维数组的遍历:
for遍历
package main
import "fmt"
func main() {
cityArry := [2][2]string{{"北京", "上海"}, {"苏州", "无锡"}}
for i := 0; i < len(cityArry); i++ {
for j := 0; j < len(cityArry[i]); j++ {
fmt.Printf("第%v行, 第%v列的值为%v
", i+1, j+1, cityArry[i][j])
}
}
}
运行结果
第1行, 第1列的值为北京
第1行, 第2列的值为上海
第2行, 第1列的值为苏州
第2行, 第2列的值为无锡
for range遍历
package main
import "fmt"
func main() {
numArry := [2][3]int{{1, 2, 3}, {4, 5, 6}}
for k1, v1 := range numArry {
for k2, v2 := range v1 {
fmt.Printf("第%v行,第%v列的值为%v
", k1+1, k2+1, v2)
}
}
}
运行结果
第1行,第1列的值为1
第1行,第2列的值为2
第1行,第3列的值为3
第2行,第1列的值为4
第2行,第2列的值为5
第2行,第3列的值为6
五、数组是值类型
Go语言中的数组是值类型,而不是引用类型。赋值和传参会复制整个数组。因此改变副本的值,不会改变数组本身的值。
a := [...]int{1, 2, 3}
b := a
b[0] = 100
fmt.Println(a)//[1 2 3]
fmt.Println(b)//[100 2 3]
数组的大小是类型的一部分。因此[5]int和[10]int是不同的类型。
package main
func main() {
a := [5]int{1, 2, 3, 4, 5}
var b [10]int
b = a //cannot use a (type [5]int) as type [10]int in assignment
}
六、数组排序
go分别提供了sort.Float64s()
sort.Strings()
sort.Ints()
对不同类型的数组进行排序,默认是升序。降序需要使用sort.Reverse
package main
import (
"fmt"
"sort"
)
func main() {
intArry := [...]int{12, 2, 23, 44, 22, 10}
floatArry := [...]float64{12.1, 2.4, 23.4, 45.1, 22.5, 10.7}
stringArry := [...]string{"abc", "ab", "bc"}
// 升序排列
sort.Ints(intArry[:])
sort.Float64s(floatArry[:])
sort.Strings(stringArry[:])
fmt.Println(intArry)
fmt.Println(floatArry)
fmt.Println(stringArry)
// 降序排列
sort.Sort(sort.Reverse(sort.IntSlice(intArry[:])))
sort.Sort(sort.Reverse(sort.Float64Slice(floatArry[:])))
sort.Sort(sort.Reverse(sort.StringSlice(stringArry[:])))
fmt.Println(intArry)
fmt.Println(floatArry)
fmt.Println(stringArry)
}
运行结果
[2 10 12 22 23 44]
[2.4 10.7 12.1 22.5 23.4 45.1]
[ab abc bc]
[44 23 22 12 10 2]
[45.1 23.4 22.5 12.1 10.7 2.4]
[bc abc ab]