Go语言学习4-数组类型

简介: 本篇介绍 Go语言的数组类型

18a325e136e34114b15a6d2caa5b02de.jpeg

引言

上篇我们了解 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语言的切片类型,敬请期待!

目录
相关文章
|
2天前
|
存储 Go 索引
go语言使用for循环遍历
go语言使用for循环遍历
16 7
|
5天前
|
存储 Go
go语言 遍历映射(map)
go语言 遍历映射(map)
18 2
|
6天前
|
Go 调度 开发者
Go语言中的并发编程:深入理解goroutines和channels####
本文旨在探讨Go语言中并发编程的核心概念——goroutines和channels。通过分析它们的工作原理、使用场景以及最佳实践,帮助开发者更好地理解和运用这两种强大的工具来构建高效、可扩展的应用程序。文章还将涵盖一些常见的陷阱和解决方案,以确保在实际应用中能够避免潜在的问题。 ####
|
6天前
|
测试技术 Go 索引
go语言使用 range 关键字遍历
go语言使用 range 关键字遍历
14 3
|
6天前
|
测试技术 Go 索引
go语言通过 for 循环遍历
go语言通过 for 循环遍历
16 3
|
8天前
|
安全 Go 数据处理
Go语言中的并发编程:掌握goroutine和channel的艺术####
本文深入探讨了Go语言在并发编程领域的核心概念——goroutine与channel。不同于传统的单线程执行模式,Go通过轻量级的goroutine实现了高效的并发处理,而channel作为goroutines之间通信的桥梁,确保了数据传递的安全性与高效性。文章首先简述了goroutine的基本特性及其创建方法,随后详细解析了channel的类型、操作以及它们如何协同工作以构建健壮的并发应用。此外,还介绍了select语句在多路复用中的应用,以及如何利用WaitGroup等待一组goroutine完成。最后,通过一个实际案例展示了如何在Go中设计并实现一个简单的并发程序,旨在帮助读者理解并掌
|
7天前
|
Go 索引
go语言按字符(Rune)遍历
go语言按字符(Rune)遍历
21 3
|
11天前
|
Go API 数据库
Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
本文介绍了 Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
35 4
|
11天前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
45 1
|
9天前
|
存储 Go PHP
Go语言中的加解密利器:go-crypto库全解析
在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。
28 0