跳到主要内容

数组

当存储一个学生名字时可以name="yuan",但是如果班级有三十人,每个人的名字都想存储到内存中怎么办呢?总不能用三十个变量分别存储吧,这时数组就可以发挥作用了。

数组其实是和字符串一样的序列类型,不同于字符串在内存中连续存储字符,数组用[]的语法将同一类型的多个值存储在一块连续内存中。

2.1、声明数组

var 数组名 [元素数量]元素类型
var names [5]string
fmt.Println(names,reflect.TypeOf(names)) // [ ] [5]string

var ages [5]int
fmt.Println(ages,reflect.TypeOf(ages)) // [0 0 0 0 0] [5]int

截屏2022-08-02 12.12.25

提示

在计算机语言中数组是非常重要的集合类型,大部分计算机语言中数组具有如下三个基本特性:

提示
  1. 一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。
提示
  1. 有序性:数组中的元素是有序的,通过下标访问。
提示
  1. 不可变性:数组一旦初始化,则长度(数组中元素的个数)不可变。
var x [3]int
var y [5]int

// x y的数据类型相同吗?

2.2、数组初始化

初始化方式1:先声明再赋值

var names [5]string
var ages [5]int

names[0] = "张三"
names[1] = "李四"
names[2] = "王五"
names[3] = "赵六"
names[4] = "孙七"

fmt.Println(names) // [张三 李四 王五 赵六 孙七]

ages[0] = 23
ages[1] = 24
ages[2] = 25
ages[3] = 26
ages[4] = 27

fmt.Println(ages) // [23 24 25 26 27]

截屏2022-08-02 12.19.49

初始化方式2:声明并赋值

var names = [3]string{"张三","李四","王五"}
var ages = [3]int{23,24,25}

fmt.Println(names) // [张三 李四 王五]
fmt.Println(ages) // [23 24 25]

初始化方式3: [...]不限长度

var names = [...]string{"张三","李四","王五"}
var ages = [...]int{23,24,25}

fmt.Println(names,reflect.TypeOf(names)) // [张三 李四 王五] [3]string
fmt.Println(ages,reflect.TypeOf(ages)) // [23 24 25] [3]int

初始化方式4:索引设置

var names = [...]string{0:"张三",2:"王五"}

fmt.Println(names) // [张三 王五]

2.3、基于索引访问和修改数组元素

var names = [...]string{"张三","李四","王五","赵六","孙七"}

// 索引取值
fmt.Println(names[2])

// 修改元素值
names[0] = "zhangsan"
fmt.Println(names)

// 切片取值
fmt.Println(names[0:4])
fmt.Println(names[0:])
fmt.Println(names[:3])

// 循环取值
for i:=0;i<len(names);i++{

fmt.Println(i,names[i])
}

for k,v := range names{ // range 表达式是副本参与循环

fmt.Println(k,v)
}