Go语言学习之旅07——数组

定义数组

1
2
3
4
5
6
7
func main() {
var arr1 [5]int // 声明数组,不赋值
arr2 := [5]int{1, 2, 3, 4, 5} // 声明数组并赋值,指定数组长度,完整赋值
arr3 := [5]int{1, 2, 3} // 不完整赋值,未赋值的为0
arr4 := [5]int{2: 1, 3: 2} // 指定下标赋值,为下标2赋值1,下标3赋值2,其余为0
arr5 := [...]int{1, 2, 3, 4, 5} // 声明数组,长度由编译器自动识别
}

数组的比较,比较其每一个元素是否都相同:

1
2
3
4
5
func main() {
arr1 := [5]int{1, 2, 3, 4, 5}
arr2 := [5]int{1, 2, 3, 4, 5}
fmt.Println(arr1 == arr2) // 返回true
}

定义二维数组

1
2
3
4
func main() {
var arr4 [4][5]int // 定义4个长度为5的数组
fmt.Println(arr4)
}

遍历数组

1
2
3
4
5
6
7
8
9
func main() {
for i := 0; i < len(arr4); i++ { // 一般遍历方法
fmt.Println(arr4[i])
}

for _, value := range arr2 { // 推荐遍历方法
fmt.Println(value)
}
}

当使用range进行遍历的时候,可以接受两个返回值,返回值1是下标,返回值2是对应下标的内容,下划线可以表示不需要该返回值

为什么要使用range

  • 意义明确、美观
  • C++原生没有该能力
  • Java、Python原生不能同时获取下标和值

注意:在go语言中,数组也是值类型,作为参数传递时,传递的是其拷贝,而不是其引用,因此需要指针才能修改

数组作为函数的参数

注意:数组作为参数是值传递,即,我们形参是实参的拷贝,如果需要同步修改,就要使用指针数组

1
2
3
4
5
6
7
8
func main() {
arr := [5]int{1, 2, 3, 4, 5}
modify(&arr)
fmt.Println(arr)
}
func modify(arr *[5]int) {
(*arr)[0] = 99 // 使用*取值
}

输出:[99 2 3 4 5]

进过测试,这样写也可以,当前go版本为:go version go1.11 darwin/amd64

1
2
3
4
5
6
7
8
func main() {
arr := [5]int{1, 2, 3, 4, 5}
modify(&arr)
fmt.Println(arr)
}
func modify(arr *[5]int) {
arr[0] = 99 // 没有取值
}