数组
当存储一个学生名字时可以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
提示
在计算机语言中数组是非常重要的集合类型,大部分计算机语言中数组具有如下三个基本特性:
提示
- 一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。
提示
- 有序性:数组中的元素是有序的,通过下标访问。
提示
- 不可变性:数组一旦初始化,则长度(数组中元素的个数)不可变。
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]
初始化方式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)
}