(数组类型)
引言
上篇我们了解Go语言的基本数据类型,现在开始介绍数组类型。主要如下:
1. 数组
在Go语言中,数组被称为Array,就是一个由若干相同类型的元素组成的序列。
1.1 类型表示法
如下声明了一个长度为n,元素类型为T的数组类型:
[n]T
注意:数组的长度是数组类型的一部分。只要类型声明中的数组长度不同,即使两个数组类型的的元素类型相同,它们也还是不同的类型。例如,数组类型[2]string和[3]string就是两个不同的类型,虽然它们的元素类型都是string。所有属于这个类型的数组的长度都是固定的。
在数组类型声明中所标识的长度可以由一个非负的整数字面量代表,也可以由一个表达式代表(这个表达式必须是一个int类型的非负值),例如:
[2*3+4]byte
这个类型字面量表示了一个元素类型为byte的数组类型。
数组类型声明中的元素类型可以是任意一个有效的Go语言数据类型(预定义数据类型、复合数据类型,自定义数据类型或者类型字面量)。例如:
[5]struct{ name, address string} // ”struct {…}”是用于自定义匿名结构体类型的类型字面量
以上提示我们,虽然数组的元素类型只能是单一数据类型,但是因为这个单一数据类型可以是一个复合数据类型,所以可以使用数组构造出更多样的数据结构,而不只是把它当做包含若干相同类型元素的有序列表。
1.2 值表示法
数组类型的值(简称数组值)可以由复合字面量来表示。例如:
[6]string{"Go", "Python", "Java", "C", "C++", "PHP"}
该字面量表示了一个长度为6,元素类型为string的数组值,且已包含了6个元素值。 我们也可以编写上面的复合字面量的时候指定元素值的索引值。例如:
[6]string{0: "Go", 1: "Python", 2: "Java", 3: "C", 4: "C++", 5: "PHP"}
这个字面量也体现了在默认情况下的各个元素值与索引值的对应关系。 这种添加索引值的字面量也可以打乱默认的对应关系,例如:
[6]string{2: "Go", 1: "Python", 5: "Java", 4: "C", 3: "C++", 0: "PHP"}
或者,只显式地指定一部分元素值的索引值,例如:
[6]string{5: "Go", 0: "Python", "Java", "C", "C++", 4: "PHP"}
如上“Java”, “C”,“C++” 的隐含索引值为1, 2, 3 索引值的指定方式很灵活,但还是需要满足下面两个条件:
- 指定的索引值必须在该数组的类型所体现的有效范围之内,即大于等于0并且小于数组类型中声明的长度。同样,我们指定的索引值也不能导致后续元素值的索引值超出范围。
- 指定的索引值不能与其他元素值的索引值重复,不论其他元素值的是隐含对应的还是显式对应的。
方括号之间的整数表示数组值的长度,它必须大于或等于花括号中元素值的实际数量。例如:
[8]string{"Go", "Python", "Java", "C", "C++", "PHP"}
上面这个数组值等同于下面的复合字面量:
[8]string{0: "Go", 1: "Python", 2: "Java", 3: "C", 4: "C++", 5: "PHP", 6: "", 7: ""}
我们也可以不指定数组值的长度,而是让其中元素值的实际数量决定,例如:
[...]string{"Go", "Python", "Java", "C", "C++", "PHP"}
1.3 属性和基本操作
数组类型属于值类型。一个数组类型的变量在被声明之后就会拥有一个非空值。这个非空值包含的元素值的数量与其类型中所声明的长度一致,并且其中的每个元素值都是其类型的元素类型的零值。
在Go语言中,一个数组即是一个值。数组类型的变量即代表了整个数组,不像C语言中的数组代表一个指向数组的第一个元素值的指针。因此,当我们将一个数组值赋给一个变量或者传递给一个函数的时候,会隐含地创建出此数组值的一个备份。为避免这种隐含的备份,我们可以通过取址操作符获取到这个数组值的指针,并把这个指针用在变量赋值操作和函数参数传递的操作中。
使用Go语言的内建函数len来获取数组值的长度,例如:
len([...]string{"Go", "Python", "Java", "C", "C++", "PHP"})
通过索引值访问数组中的每一个元素,例如:
[...]string{"Go", "Python", "Java", "C", "C++", "PHP"}[0]//值是"Go"
[...]string{"Go", "Python", "Java", "C", "C++", "PHP"}[5]//值是"PHP"
通过索引值改变对应的元素,例如:
// := 表示声明一个变量的同时对这个变量进行赋值。
array1 := [6]string{"Go", "Python", "Java", "C", "C++", "PHP"}//数组值赋给变量array1
array1[1] = "Swift" //与索引值1对应的元素修改为字符串类型值Swift
执行上面的语句后,array1的值:
[6]string{"Go", "Python", "Java", "C", "C++", "PHP"}
注意:如果上面的array1的值为nil,那么索引值在被求值时就会引发一个运行时恐慌。同样索引值不在有效范围内的时候也一样。
总结
本篇介绍了 Go语言的数组类型,下篇介绍 Go语言的切片类型,敬请期待!