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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 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知识可以通过官网文档来进行学习。


相关文章
|
7天前
|
存储 监控 算法
内网监控系统之 Go 语言布隆过滤器算法深度剖析
在数字化时代,内网监控系统对企业和组织的信息安全至关重要。布隆过滤器(Bloom Filter)作为一种高效的数据结构,能够快速判断元素是否存在于集合中,适用于内网监控中的恶意IP和违规域名筛选。本文介绍其原理、优势及Go语言实现,提升系统性能与响应速度,保障信息安全。
22 5
|
17天前
|
算法 安全 Go
Go语言中的加密和解密是如何实现的?
Go语言通过标准库中的`crypto`包提供丰富的加密和解密功能,包括对称加密(如AES)、非对称加密(如RSA、ECDSA)及散列函数(如SHA256)。`encoding/base64`包则用于Base64编码与解码。开发者可根据需求选择合适的算法和密钥,使用这些包进行加密操作。示例代码展示了如何使用`crypto/aes`包实现对称加密。加密和解密操作涉及敏感数据处理,需格外注意安全性。
38 14
|
17天前
|
Go 数据库
Go语言中的包(package)是如何组织的?
在Go语言中,包是代码组织和管理的基本单元,用于集合相关函数、类型和变量,便于复用和维护。包通过目录结构、文件命名、初始化函数(`init`)及导出规则来管理命名空间和依赖关系。合理的包组织能提高代码的可读性、可维护性和可复用性,减少耦合度。例如,`stringutils`包提供字符串处理函数,主程序导入使用这些函数,使代码结构清晰易懂。
63 11
|
17天前
|
存储 安全 Go
Go语言中的map数据结构是如何实现的?
Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。
|
8月前
|
开发框架 安全 中间件
Go语言开发小技巧&易错点100例(十二)
Go语言开发小技巧&易错点100例(十二)
87 1
|
1月前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
2月前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
51 3
|
2月前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
45 3
|
5月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
201 1
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
5月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
153 0
go语言后端开发学习(六) ——基于雪花算法生成用户ID

推荐镜像

更多