Go语言中的数组、切片和映射解析

简介: Go语言中的数组、切片和映射解析

数组

数组存放的是固定长度、相同类型的数据,而且这些存放的元素是连续的。

数组的声明

例如声明一个整形数组:

array := [3]int{1, 2, 3}

在类型名前加 [] 中括号,并设置好长度,大括号中的元素用于初始化数组,需要注意的是数组的长度不同,即属于不同的类型。

如果所有元素都被初始化的数组,声明时可以省略数组长度,例如上述的数组可以不写长度:

array := []int{1, 2, 3}

数组循环

使用传统for进行数组遍历:

for i := 0; i < 3; i++ {
    fmt.Println(array[i])
  }

还有就是使用go中提供的for range循环,代码如下:

for i, v := range array {
    fmt.Println(i, v)
  }

range表达式返回的结果分别为索引与数值,如果返回值用不到可使用下划线丢弃掉。

切片

切片是基于数组实现的,它的底层就是一个数组。对数组任意分隔,就可以得到一个切片。切片是一个具备三个字段的数据结构,分别是指向数组的指针 data,长度 len 和容量 cap。

切片声明

使用 make 函数进行切片声明,声明一个元素类型为 int 的切片,长度是 4,make 函数还可以传入一个容量参数:

slice := make([]int, 3)
  fmt.Println(slice)

我们进行打印默认是0。

传入容量:

slice := make([]int, 3, 5)

当然切片的容量不能比切片的长度小。

容量就是申请的内存空间,而长度是已经使用的内存空间,我们可以通过 append 函数往切片中追加元素,来使用空闲内存。

slice = append(slice, 1, 2)
  fmt.Println(slice)

通过结果可知直接追加到空闲内存上了。

切片元素循环

切片的循环和数组一模一样,常用的也是 for range 方式。

for i,v  := range slice {
    fmt.Println(i, v)
  }

输出的分别是切片的索引与数值。

映射

在 Go 语言中,map 是一个无序的 K-V 键值对集合,结构为 map[K]V。其中 K 对应 Key,V 对应 Value。map 中所有的 Key 必须具有相同的类型,Value 也同样,但 Key 和 Value 的类型可以不同。

Map的声明及初始化

可通过内置的 make 函数进行map的创建,并进行赋值,代码如下:

map6 := make(map[string]int)
  map6["a"] = 1   

也可使用字面量的方式进行map的创建,并进行赋值操作,代码如下:

map7 := map[string]int{}
  map7["b"] = 2

map 的 [] 操作符可以返回两个值,第一个是value,第二个是key,如果存在则返回true。示例如下:

map7 := map[string]int{}
  map7["b"] = 2
  v, k := map7["b"]
  fmt.Println(v, k)

Map的遍历

在 Go 语言中,map 的遍历使用 for range 循环。

对于 map,for range 同样返回两个值,一个是key,一个是value。示例如下:

map6 := make(map[string]int)
  map6["a"] = 1
  map6["b"] = 2
  map6["c"] = 3
  for k, v := range map6 {
    fmt.Println(k, v)
  }

通过两张结果图可以看出map 的遍历是无序的,也就是说你每次遍历,键值对的顺序可能会不一样。

map的大小可以使用内置的 len 函数进行获取。

println(len(map6))

总结:

1.数组是具有固定长度和相同类型的数据集合。声明数组时需要指定数组的长度和元素类型,也可以省略长度以创建一个长度可变的数组。

2.切片是对数组的一个引用,它包含指向数组的指针、长度和容量信息。可以使用make函数创建切片,并使用append函数向切片追加元素。

3.映射是一个无序的键值对集合,键和值可以是不同的类型。可以使用内置的make函数或字面量方式创建映射,并使用for range循环遍历映射。

4.在Go语言中,可以使用传统的for循环或for range循环遍历数组和切片。for range循环返回键值对,可以用于遍历映射。

5.可以通过len函数获取映射的大小。

想了解更多go知识可以通过官网文档来进行学习。


相关文章
|
6月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
627 0
|
4月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
525 43
Go语言深度解析:从入门到精通的完整指南
|
10月前
|
算法 Go 索引
【LeetCode 热题100】45:跳跃游戏 II(详细解析)(Go语言版)
本文详细解析了力扣第45题“跳跃游戏II”的三种解法:贪心算法、动态规划和反向贪心。贪心算法通过选择每一步能跳到的最远位置,实现O(n)时间复杂度与O(1)空间复杂度,是面试首选;动态规划以自底向上的方式构建状态转移方程,适合初学者理解但效率较低;反向贪心从终点逆向寻找最优跳点,逻辑清晰但性能欠佳。文章对比了各方法的优劣,并提供了Go语言代码实现,助你掌握最小跳跃次数问题的核心技巧。
439 15
|
5月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
8月前
|
存储 设计模式 安全
Go 语言单例模式全解析:从青铜到王者段位的实现方案
单例模式确保一个类只有一个实例,并提供全局访问点,适用于日志、配置管理、数据库连接池等场景。在 Go 中,常用实现方式包括懒汉模式、饿汉模式、双重检查锁定,最佳实践是使用 `sync.Once`,它并发安全、简洁高效。本文详解各种实现方式的优缺点,并提供代码示例与最佳应用建议。
278 5
|
6月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
486 0
|
6月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
9月前
|
存储 算法 Go
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
LeetCode 17题解题思路采用回溯算法,通过递归构建所有可能的组合。关键点包括:每位数字对应多个字母,依次尝试;递归构建下一个字符;递归出口为组合长度等于输入数字长度。Go语言实现中,使用map存储数字到字母的映射,通过回溯函数递归生成组合。时间复杂度为O(3^n * 4^m),空间复杂度为O(n)。类似题目包括括号生成、组合、全排列等。掌握回溯法的核心思想,能够解决多种排列组合问题。
401 11
|
8月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
362 1
|
9月前
|
Go 索引
Go语言数组的定义与操作 - 《Go语言实战指南》
本文介绍了 Go 语言中的数组(Array)相关知识,包括定义、初始化方式(默认、显式、指定索引及自动推导长度)、访问与修改、遍历方法(for 循环和 for range)、值类型特性(复制行为)、多维数组支持以及其与切片的区别。数组是定长且同类型的集合,适合性能敏感场景,但实际开发中更常用动态的切片(slice)。
312 11

推荐镜像

更多
  • DNS