数组是线性表的一种实现,是最基本的数据结构之一。它以连续的地址空间存储相同类型的元素,按索引访问数组元素。优点是可以实现随机存取O(1),缺点是删除和添加一个元素需要在操作位置后大量移动元素O(n)
Go语言也提供了数组这一类型,它可以存储整形、浮点型、字符串或者其他自定义类型。在概念上,Go语言的数组同其他语言的数组没有区别。
声明数组语法如下:
代码语言:javascript复制var array_name [SIZE]variable_type
Go数组声明的时候一定要指定数组长度。如果不指定数组长度的,声明的不是数组而是切片。
实例:
代码语言:javascript复制var nums [10]int
同其他语言,数组声明的同时,可以使用花括号指定元素值来初始化数组,如下:
代码语言:javascript复制var nums = [10]int {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
同其他语言,可以通过数组下标访问数组元素:
代码语言:javascript复制var res int = nums[5]
num := nums[10]
同样支持多维数组,语法如下:
代码语言:javascript复制var array_name [SIZE1][SIZE2]...[SIZEN] variable_type
初始化和访问二维数组同上,只不过要使用两个下标,实例如下:
代码语言:javascript复制package main
import "fmt"
func main() {
var board = [4][4]int {{0, 0, 0, 0}, {1, 0, 0, 0}, {0, 1, 0, 1}, {0, 0, 0, 0}}
for i:=0; i<len(board); i {
for j:=0; j< len(board[0]); j {
if board[i][j] == 1 {
fmt.Printf("坐标(%d,%d)已经被访问过n", i, j)
}
}
}
}
// 坐标(1,0)已经被访问过
// 坐标(2,1)已经被访问过
// 坐标(2,3)已经被访问过
作为函数参数传递
在函数定义时,指定形参为数组,写法上需要写明数组大小,不写明数据大小传递的是切片,这是不一样的。
语法如下:
代码语言:javascript复制func function_name(param [10]int) // param是一个数组
func function_name(param []int) // param是一个切片
实例:
代码语言:javascript复制package main
import "fmt"
func avg(grade[5] int) {
sum := 0
for i:=0; i< len(grade); i {
sum = grade[i]
}
fmt.Printf("平均成绩为:%d", sum/len(grade))
}
func main() {
grade := [5]int {99, 78, 69, 89, 90}
avg(grade)
}
// 平均成绩为:85
该例在avg
函数定义的时候,如果不声明长度为5,会报错cannot use grade (type [5]int) as type []int in argument to avg
,因此推荐指明数组长度。