3.Go语言数据类型

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

3.2 数组

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

3.2.1 类型表示法

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

[n]T

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

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

[2*3+4]byte

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

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

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

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

3.2.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.2.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"}//数组值赋给变量array1array1[1] = "Swift" //与索引值1对应的元素修改为字符串类型值Swift

执行上面的语句后,array1的值:

[6]string{"Go", "Python", "Java", "C", "C++", "PHP"}

注意:如果上面的array1的值为nil,那么索引值在被求值时就会引发一个运行时恐慌。同样索引值不在有效范围内的时候也一样。

©著作权归作者所有:来自51CTO博客作者Huazie的原创作品,如需转载,请注明出处,否则将追究法律责任

你的鼓励让我更有动力

赞赏

0人进行了赞赏支持

更多相关文章

  1. 不懂游戏类型?敢说你懂游戏音乐
  2. Go语言学习5-切片类型
  3. Go语言学习6-字典类型
  4. 百度核心搜索面试
  5. 易错:函数方式实现二分查找整形数组
  6. 2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于
  7. C语言二维数组
  8. 2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可
  9. 学习java的第二天

随机推荐

  1. Android Services with C# Seminar
  2. android shape设置背景风格为圆角
  3. Google Android 文档笔记-Training-Getti
  4. Android版本和API对应关系
  5. Android Reverse Engineering 101 – Par
  6. Android Bluetooth Architecture
  7. Android应用程序剖析
  8. Android - Custom Components
  9. 相对布局控制控件居右显示
  10. android-环境