Go语言学习4-数组类型

举报
Huazie 发表于 2024/01/16 11:43:36 2024/01/16
【摘要】 本篇向大家介绍 Go语言的数组类型

引言

上篇我们了解 Go语言的基本数据类型,现在开始介绍数组类型。主要如下:

主要内容

在Go语言中,数组被称为Array,就是一个由若干相同类型的元素组成的序列。

1. 类型表示法

如下声明了一个长度为n,元素类型为T的数组类型:

[n]T

注意:数组的长度是数组类型的一部分。只要类型声明中的数组长度不同,即使两个数组类型的的元素类型相同,它们也还是不同的类型。例如,数组类型[2]string和[3]string就是两个不同的类型,虽然它们的元素类型都是string。所有属于这个类型的数组的长度都是固定的。

在数组类型声明中所标识的长度可以由一个非负的整数字面量代表,也可以由一个表达式代表(这个表达式必须是一个int类型的非负值),例如:

[2*3+4]byte

这个类型字面量表示了一个元素类型为byte的数组类型。

数组类型声明中的元素类型可以是任意一个有效的Go语言数据类型(预定义数据类型、复合数据类型,自定义数据类型或者类型字面量)。例如:

[5]struct{ name, address  string} // ”struct {…}”是用于自定义匿名结构体类型的类型字面量

以上提示我们,虽然数组的元素类型只能是单一数据类型,但是因为这个单一数据类型可以是一个复合数据类型,所以可以使用数组构造出更多样的数据结构,而不只是把它当做包含若干相同类型元素的有序列表。

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
索引值的指定方式很灵活,但还是需要满足下面两个条件:

  1. 指定的索引值必须在该数组的类型所体现的有效范围之内,即大于等于0并且小于数组类型中声明的长度。同样,我们指定的索引值也不能导致后续元素值的索引值超出范围。
  2. 指定的索引值不能与其他元素值的索引值重复,不论其他元素值的是隐含对应的还是显式对应的。

方括号之间的整数表示数组值的长度,它必须大于或等于花括号中元素值的实际数量。例如:

[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"}

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语言的切片类型,敬请期待!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。