Go语言学习之数组的用法详解
什么是数组
数组是一种由相同类型元素组成的集合类型。数组在Go语言中是值类型,在使用数组时,操作的是数组的副本而不是本身。
数组的声明和初始化
在Go语言中,数组的声明和初始化可以有多中方式。
声明并初始化
var arr1 [5]int // 声明一个长度为5的int类型的数组
var arr2 = [5]int{1, 2, 3, 4, 5} // 声明并初始化一个长度为5的int类型的数组
使用...
进行长度推断
arr3 := [...]int{1, 2, 3, 4, 5} // 声明并初始化一个长度为5的int类型的数组
使用索引进行初始化
arr4 := [5]int{3: 1, 4: 2} // 声明并初始化一个长度为5的int类型的数组,使用索引进行初始化
多维数组的声明和初始化
var arr5 [5][5]int // 声明一个5x5的int类型的二维数组
var arr6 = [2][2]int{{1, 2}, {3, 4}} // 声明并初始化一个2x2的int类型的二维数组
数组的访问和遍历
数组的元素可以通过索引进行访问。可以使用for
循环语句对数组进行遍历。
var arr = [5]int{1, 2, 3, 4, 5}
for i := 0; i < len(arr); i++ {
fmt.Printf("arr[%d] = %d\n", i, arr[i])
}
for i, v := range arr {
fmt.Printf("arr[%d] = %d\n", i, v)
}
可以看到,在遍历数组时,使用了语法糖range
,i
表示数组的下标,v
表示数组的元素值。
数组作为函数参数
由于数组是值类型,所以在函数调用时会拷贝整个数组。因此使用指针可以避免这种拷贝,提高性能。
func sum(arr [5]int) int {
sum := 0
for _, v := range arr {
sum += v
}
return sum
}
func sumByPointer(arr *[5]int) int {
sum := 0
for _, v := range arr {
sum += v
}
return sum
}
func main() {
arr1 := [5]int{1, 2, 3, 4, 5}
arr2 := &arr1
fmt.Println(sum(arr1))
fmt.Println(sumByPointer(arr2))
}
可以看到,在函数sum
中传递了数组的副本,而函数sumByPointer
传递了指向数组的指针。
示例
示例1:找出数组中的最大值
对于一个长度为n的数组,可以定义一个变量max,初始值为数组的第一个元素,然后遍历整个数组,如果数组的元素比max大,就将max赋值为这个元素,最终max即为数组中的最大值。
func findMax(arr [5]int) int {
max := arr[0]
for _, v := range arr {
if v > max {
max = v
}
}
return max
}
func main() {
arr := [5]int{1, 3, 5, 2, 4}
fmt.Println(findMax(arr))
}
输出:
5
示例2:矩阵转置
给定一个二维数组,将它转置。
func transpose(matrix [3][3]int) [3][3]int {
var res [3][3]int
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
res[i][j] = matrix[j][i]
}
}
return res
}
func main() {
matrix := [3][3]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
fmt.Println("origin matrix:")
for _, row := range matrix {
fmt.Println(row)
}
res := transpose(matrix)
fmt.Println("transpose matrix:")
for _, row := range res {
fmt.Println(row)
}
}
输出:
origin matrix:
[1 2 3]
[4 5 6]
[7 8 9]
transpose matrix:
[1 4 7]
[2 5 8]
[3 6 9]
以上就是Go语言学习之数组的用法详解,希望能对你的学习有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go语言学习之数组的用法详解 - Python技术站