【go语言学习】数组array

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]
原文地址:https://www.cnblogs.com/everydawn/p/13880543.html