Go 编程 | 连载 10 - 复杂数据类型 Array

简介: Go 编程 | 连载 10 - 复杂数据类型 Array

一、数组 Array

数组是具有唯一相同类型固定长度的一个序列,序列中的元素可以是任意类型如字符串、整型或者是自定义类型,但是类型一定要一致。

数组中的元素可以通过索引来读取或者修改,索引从 0 开始。

7deeae0003e443818727b0fa7841b753_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

数组的初始化方式

// 定义一个数组
// var 数组名 [数组长度/元素个数]元素类型
var arrayName [arrayLen]eleType
// 初始化并赋值
var arrayName = [arrayLen]eleType{ele1,ele2,ele3...}
// 自动判断数组的长度
var arrayName = [...]eleType{ele1,ele2,ele3...}
复制代码
func main() {
   var heros = [3]string{"stark", "steve", "thor"}
   fmt.Printf("%T", heros)
   var hero_arr = [...]string{"stark", "thor", "steve"}
   fmt.Printf("%T, %v", hero_arr, len(hero_arr))
}
复制代码

执行上述代码,输出结果如下:

[3]string
[3]string, 3
复制代码

数组的长度也是数组类型的一部分,不同长度的数组即使包含的元素一样也不能算作是同一类型。

需要注意的是声明数组时定义的长度或者元素的个数要大于等于在赋值时给的元素的个数,否则会报错。

d0c9e1bf40ae4e33a388652772b59c4e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

使用默认值的初始化方式

在定义数组时如果赋值的元素个数小于数组定义的长度,则缺失的元素会使用元素数据类型的默认值填充。

func main() {
   var nums = [5]int{1, 3}
   fmt.Printf("%T, %v", nums, nums)
}
复制代码

执行上述代码,输出结果如下:

[5]int, [1 3 0 0 0]
复制代码

如果元素类型为 string,则默认值为空字符串。

通过索引操作数组元素

数组的操作包括读取和修改,都可以通过索引来完成

func main() {
   var hero_arr = [...]string{"stark", "thor", "steve"}
   fmt.Printf("%T, %v\n", hero_arr, len(hero_arr))
   hero_arr[0] = "tony stark"
   fmt.Println(hero_arr)
   thuner := hero_arr[1]
   fmt.Println(thuner)
}
复制代码

执行上述代码,输出结果如下:

[3]string, 3
[tony stark thor steve]
thor
复制代码

数组的遍历

数组的遍历有两种方式,一种是通过 for ... i 方式遍历,另一种是通过 for ... range 方式遍历。

func main() {
   var nums = [...]int{11, 22, 33}
   // 数组长度的获取使用 len() 函数
   // for 遍历
   fmt.Println("for 遍历:")
   for i := 0; i < len(nums); i++ {
      fmt.Printf("索引:%v, 对应值为:%v\n", i, nums[i])
   }
   // for range 遍历
   fmt.Println("for range 遍历:")
   for idx, item := range nums {
      fmt.Printf("索引:%v, 对应值为:%v\n", idx, item)
   }
}
复制代码

执行上述代码,输出结果如下:

for 遍历:
索引:0, 对应值为:11
索引:1, 对应值为:22
索引:2, 对应值为:33
for range 遍历:
索引:0, 对应值为:11
索引:1, 对应值为:22
索引:2, 对应值为:33
复制代码

二、数组是值类型

Go 中的数据类型还可以分为值类型和引用类型,Go 中的基本数据类型包括数组都是值类型。

定义一个函数 ArrayHandler,该函数需要一个固定长度的数组作为参数,函数体会对传入的数组进行修改并打印出修改前后的值。

func main() {
   codes := [3]string{"zulu", "yankee", "xray"}
   ArrayHandler(codes)
   fmt.Println(codes)
}
func ArrayHandler(arr [3]string) {
   fmt.Println("修改前:", arr)
   //
   for idx, item := range arr {
      // 将每个元素字母改为大写
      arr[idx] = strings.ToTitle(item)
   }
   fmt.Println("修改后:", arr)
}
复制代码

执行上述代码,输出结果如下:

修改前: [zulu yankee xray]
修改后: [ZULU YANKEE XRAY]
[zulu yankee xray]
复制代码

Go 中的数组是值传递,作为参数传递时时会重新拷贝一个副本,所有的修改操作都是在副本上进行的,对原数据无任何影响。

其他语言如 Python ,Java 中的数组使用的是引用传递。


相关文章
|
20天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
101 67
|
1月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
34 1
|
1月前
|
存储 编译器 Go
go语言中的变量、常量、数据类型
【11月更文挑战第3天】
36 9
|
1月前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
42 7
|
1月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
2月前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
53 7
|
2月前
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。
|
2月前
|
并行计算 算法 搜索推荐
探索Go语言的高并发编程与性能优化
【10月更文挑战第10天】探索Go语言的高并发编程与性能优化
|
Go Windows
《Go语言入门》如何在Windows下安装Go语言编程环境
概述 本文为Go语言学习入门第一篇,《Go语言入门》如何在Windows下安装Go语言编程环境 。 主要讲Go语言编译环境的安装以及基于Notepad++(Go语言插件、语法高亮)的开发环境配置。
1262 0