定义
概念定义
数组是一种非常基本的数据结构,用于存储固定大小的同类型元素的集合。与切片不同,数组的长度在声明时就必须确定,且在其生命周期内不可改变。
代码使用
定义数组
package main
import "fmt"
func main() {
// 第一种定义方式
var a = [5]int{}
// 第二种定义方式, 定义时初始化
var b = [5]int{1, 2, 3, 4, 5}
// 第三种定义方式, 只定义部分,未定义的由0补足
var c = [5]int{1, 2, 3}
// 第四种定义方式, 不显示定义长度,由初始化值的个数决定
var d = [...]int{1, 2, 3, 4, 5}
// 第五种定义方式
var e [5]int
// 第六种定义方式
f := [5]int{}
fmt.Printf("a = %v\n", a)
fmt.Printf("b = %v\n", b)
fmt.Printf("c = %v\n", c)
fmt.Printf("d = %v\n", d)
fmt.Printf("e = %v\n", e)
fmt.Printf("f = %v\n", f)
}
-------------------------运行结果--------------------------
a = [0 0 0 0 0]
b = [1 2 3 4 5]
c = [1 2 3 0 0]
d = [1 2 3 4 5]
e = [0 0 0 0 0]
f = [0 0 0 0 0]
访问与修改数组
数组的访问和其他语言类似,通过index的方式进行访问,也是从0开始计算索引
package main
import "fmt"
func main() {
var a = [5]int{1, 2, 3, 4, 5}
fmt.Printf("第一个数是:%d\n", a[0])
// 对a[0]进行修改
a[0] = 10
fmt.Printf("第一个数是:%d", a[0])
}
-------------------------运行结果--------------------------
第一个数是:1
第一个数是:10
查询数组长度
package main
import "fmt"
func main() {
var a = [5]int{}
fmt.Printf("a的长度为:%d\n", len(a))
}
-------------------------运行结果--------------------------
a的长度为:5
多维数组
我们上面所说的都是一维数组,如[1,2,3,4,5]。如定义所说那样,数组用来存储相同类型的数据类型的集合,我们可以通过定义数组的数组,数组的数组的数组来实现多维数组。
package main
import "fmt"
func main() {
var a = [5][5]int{}
var b = [5][5][5]int{}
fmt.Printf("a = %v\n", a)
fmt.Printf("b = %v\n", b)
a[0][0] = 10
fmt.Printf("a = %v\n", a)
}
-------------------------运行结果--------------------------
a = [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
b = [[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]]
a = [[10 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
遍历数组
package main
func main() {
// 一维数组
a := [5]int{1, 2, 3, 4, 5}
for index, element := range a {
// index是索引,element是元素
// todo something
}
b := [5][5]int{{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}}
for index1, element1 := range b {
for index2, element2 := range element1 {
// 几维数组就需要几层for循环来遍历
}
}
}
想要解决的问题
- 提供了一种基础数据类型,用于存储和使用固定大小同类型的数据
- 定义时就在内存中分配好了连续内存,其访问速度相比切片更快,但不如切片灵活
使用场景
需要存储和使用相同数据类型的数据
问题探究
如果index值超出了数组的范围会怎样
会编译报错,直接不给使用,可以使用变量跳过编译报错,但是会panic(数组越界)
package main
import "fmt"
func main() {
// 一维数组
a := [5]int{1, 2, 3, 4, 5}
fmt.Printf("第-1个元素是;%d\n", a[-1])
fmt.Printf("第5个元素是;%d\n", a[5])
}
-------------------------运行结果--------------------------
./main.go:8:41: invalid argument: index -1 (constant of type int) must not be negative
./main.go:9:40: invalid argument: index 5 out of bounds [0:5]
package main
import "fmt"
func main() {
// 一维数组
a := [5]int{1, 2, 3, 4, 5}
i := 5
fmt.Printf("第i个元素是%d\n", a[i]) // 通过该方式可以越过编译报错
}
-------------------------运行结果--------------------------
panic: runtime error: index out of range [5] with length 5
goroutine 1 [running]:
main.main()
/Users/bytedance/GolandProjects/awesomeProject/main.go:9 +0x24
把数组作为入参进行修改,会修改原数组的值么
数组是值传递,赋值和传递会创建副本,不会修改原有数组的值
package main
import "fmt"
func main() {
var a = [5]int{1, 2, 3, 4, 5}
fmt.Printf("修改前a=%v\n", a)
change(a)
fmt.Printf("修改后a=%v\n", a)
}
func change(input [5]int) {
input[0] = 100
}
-------------------------运行结果--------------------------
修改前a=[1 2 3 4 5]
修改后a=[1 2 3 4 5]