Go 数组详解和实战

简介: 数组是存放元素的容器,Go语言中数组的长度是数组类型的一部分,定义数组时必须指定存放元素的类型和容量(长度)

微信图片_20221112151445.jpg数组是存放元素的容器,Go语言中数组的长度是数组类型的一部分,定义数组时必须指定存放元素的类型和容量(长度)


定义


var a1 [3]bool
var a2 [4]int
fmt.Printf("a1:%T\na2:%T\n", a1, a2)


打印结果:


微信图片_20221112151420.jpg


数组初始化


默认值


定义数组时不进行初始化,默认元素都是零值:bool类型的false、整型和浮点类型的0、字符串的空串" "


var a1 [3]bool 
var a2 [4]int
// 如果不初始化:默认元素都是零值(布尔值:false 整型和浮点类型:0 字符串:"")
fmt.Println(a1, a2)


打印结果:

微信图片_20221112151425.jpg


初始化方式1


最简单的初始化方式,在大括号中定义好和长度一致的值。


var a1 [3]bool 
a1 = [3]bool{true,false,false}
fmt.Println(a1)


打印结果:

微信图片_20221112151428.jpg


初始化方式2:根据初始值自动判断数组的长度


在中括号中写明长度,当定义的数值个数比长度小时,会用默认值补齐,比如:0、false、""


a8 := [10]int{0, 1, 2, 3, 4, 5, 6, 7}  //7后面会用0补齐
fmt.Println(a8)


打印结果: [0 1 2 3 4 5 6 7 0 0]


[...]的用法


[...]设置数组长度时,会根据初始值自动判断数组的长度


aa := [...]int{0, 1, 2, 3, 4, 5, 6, 7} //[...]根据初始值自动判断数组的长度
fmt.Println(aa)


打印结果:[0 1 2 3 4 5 6 7]


初始化方式3:根据索引初始化


指定索引对应的值,未指定索引的值会用默认值填充,比如:0、false、""


a3 := [5]int{0: 1, 4: 2} //根据索引初始化
fmt.Println(a3)


打印结果:[1 0 0 0 2]


取值


遍历数组


fori循环遍历数组


citys := [...]string{"北京", "上海", "深圳"} //索引从0到2
// 根据索引遍历
for i := 0; i < len(citys); i++ {
   fmt.Println(citys[i])
}


打印结果:


微信图片_20221112151432.jpg


for range遍历


for range遍历更简单


citys := [...]string{"北京", "上海", "深圳"} //索引从0到2
for i, city := range citys {
   fmt.Printf("key值:%d 城市为:%v\n", i, city)
}


打印结果:


微信图片_20221112151435.jpg


多维数组


定义


我们以二维数组举例,比如我们需要定义[[1 2 3][4 5 6]]这样的二维数组,需要怎么定义呢?

示例如下:


  1. 下面代码中的第一个长度单位[2]表示二维数组的有几个元素
  2. 第二个长度单位[3]表示子集数组中有几个元素
  3. 初始化的时候:变量 = 数组类型{}


//定义多维数组
var a11 [2][3]int
//初始化多维数组
a11 = [2][3]int{
   [3]int{1, 2, 3},
   [3]int{4, 5, 6}, //注意:最后这个也要加逗号分隔
}
fmt.Println(a11)


打印结果:


微信图片_20221112151439.jpg


取值


多维数组的遍历


//定义多维数组
var a11 [2][3]int
//初始化多维数组
a11 = [2][3]int{
   [3]int{1, 2, 3},
   [3]int{4, 5, 6}, //注意:最后这个也要加逗号分隔
}
//双重for range遍历取值
for _, v1 := range a11 {
   fmt.Println(v1)
   for _, v2 := range v1 {
      fmt.Println(v2)
   }
}


打印结果:


微信图片_20221112151442.jpg


数组特点:值类型 不是引用类型


我们发现把b1赋值给b2,再修改b2的值,b1的值并没有改变。我认为这是数组和切片最大的区别,建议大家再对比学习一下切片的知识点:Go slice切片详解和实战


b1 := [3]int{1, 2, 3}
b2 := b1
b2[0] = 100
fmt.Println(b1,b2)


打印结果:


微信图片_20221112151445.jpg



总结:说明Go的数组是值类型,不是引用类型:b2:=b1的操作,给b2开辟了新的内存空间,而不是引用b1的内存地址。


数组实战


求数组cArray[1,3,5,7,8]所有元素之和


cArray := [...]int{1, 3, 5, 7, 8}
r := 0
for _, i2 := range cArray {
   r += i2
}
fmt.Printf("相加结果为:%v", r)


打印结果:相加结果为:24


求出cArray数组中,和为8的下标,比如[0 3]和[1 2]


for i := 0; i < len(cArray); i++ {
   for j := 0; j < i; j++ {
      if cArray[i]+cArray[j] == 8 {
         fmt.Printf("符合的下标为:%v,%v \n", j, i)
      }
   }
}


打印结果:


微信图片_20221112151449.jpg


总结


以上就是Go数组的详解和实战应用,建议大家和Go的切片Slice对比学习,Go slice切片详解和实战,加深理解。


公众号:程序员升级打怪之旅

微信号:wangzhongyang1993

相关文章
|
1月前
|
存储 人工智能 Go
Go-Zero全流程实战即时通讯
Go-Zero 是一个功能丰富的微服务框架,适用于开发高性能的即时通讯应用。它具备中间件、工具库和代码生成器,简化开发流程。本文介绍其环境搭建、项目初始化及即时通讯功能实现,涵盖用户认证、消息收发和实时推送,帮助开发者快速上手。
174 0
|
1月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
1月前
|
Go 开发者
Go语言实战案例:使用select监听多个channel
本文为《Go语言100个实战案例 · 网络与并发篇》第5篇,详解Go并发核心工具`select`的使用。通过实际案例讲解如何监听多个Channel、实现多任务处理、超时控制和非阻塞通信,帮助开发者掌握Go并发编程中的多路异步事件处理技巧。
|
1月前
|
数据采集 编解码 监控
Go语言实战案例:使用channel实现生产者消费者模型
本文是「Go语言100个实战案例 · 网络与并发篇」第4篇,通过实战案例详解使用 Channel 实现生产者-消费者模型,涵盖并发控制、任务调度及Go语言并发哲学,助你掌握优雅的并发编程技巧。
|
1月前
|
数据采集 消息中间件 编解码
Go语言实战案例:使用 Goroutine 并发打印
本文通过简单案例讲解 Go 语言核心并发模型 Goroutine,涵盖协程启动、输出控制、主程序退出机制,并结合 sync.WaitGroup 实现并发任务同步,帮助理解 Go 并发设计思想与实际应用。
|
1月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
2月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
2月前
|
存储 算法 数据可视化
Go语言实战:图的邻接表表示法实现详解
本文是《Go语言100个实战案例》系列之一,讲解图的邻接表表示法及其在Go语言中的实现。适用于稀疏图,节省空间,适合初学者与进阶开发者学习图结构在工程中的应用。
|
2月前
|
机器学习/深度学习 存储 算法
Go语言实战案例-广度优先遍历BFS
广度优先遍历(BFS)是一种层级展开的搜索策略,常用于树与图的遍历、最短路径查找、二维数组中的感染扩散等问题。它借助队列实现,优先访问当前层所有节点,再进入下一层,适用于寻找最短路径、层序遍历、岛屿问题等场景。
|
2月前
|
算法 Go C++
Go语言实战案例-深度优先遍历DFS
深度优先遍历(DFS)是一种用于遍历图和树结构的重要算法,其核心思想是“一条路走到底”,即沿着每个分支尽可能深入,直到无法继续再回溯。在树中,DFS包括前序、中序和后序三种遍历方式;在图中,DFS可用于寻找路径、计算连通分量、拓扑排序等。该算法通常通过递归或栈实现,适用于解决岛屿数量、迷宫路径、括号生成等经典问题。本文还对比了DFS与BFS的区别,并介绍了其在不同场景下的应用与实现方法。