Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go 语言入门系列:列表与字典及其遍历

Go 语言入门系列:列表与字典及其遍历

作者头像
aoho求索
发布于 2021-08-06 07:21:12
发布于 2021-08-06 07:21:12
3.5K00
代码可运行
举报
文章被收录于专栏:aoho求索aoho求索
运行总次数:0
代码可运行

前文回顾

前面的文章主要介绍了 Go 容器的数组和切片的基本概念以及使用。本文将会介绍列表与字典在 Go 语言中相关的使用,以及几种常用容易的遍历及其使用。。

列表与字典

Golang 的列表通过双向链表的方式实现,能够高效进行元素的插入和删除操作。列表的初始化样式如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var name list.List
// or
name := list.New()

我们可以直接声明初始化列表,也可以使用 container/list 包中的 New 函数初始化列表,后者将返回列表对应的指针。可以注意到,列表没有限制其内保存成员的类型,即任意类型的成员可以同时存在列表中。

下面我们将通过一个简单的例子演示列表的插入、删除和遍历操作,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
 "container/list"
 "fmt"
)

func main()  {
 tmpList := list.New()

 for i:= 1 ; i <= 10 ; i++ {
  tmpList.PushBack(i)
 }

 first := tmpList.PushFront(0)
 tmpList.Remove(first)

 for l := tmpList.Front(); l != nil; l = l.Next(){
  fmt.Print(l.Value, " ")
 }

}

列表的每次插入操作都会返回一个 *list.Element 结构,用以指向当前插入值所在的节点,如果要对列表中的成员进行删除、移动或者指定插入操作,需要配合指定的 *list.Element 的进行,如Remove函数。遍历列表的方式与其他容器稍微不同,需要配合 Front 函数获取列表的头元素,再使用其Next函数依次往下遍历,代码如上所示。

Golang 中提供的映射关系容器为 map ,其内部通过散列表的方式实现。定义一个 map 的样式如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name := make(map[keyType]valueType)

map 需要使用 make 函数进行初始化,其中 keyType 即键类型,valueType 即键对应的值类型。我们将通过一个简单的例子样式 map 的使用方式,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {

 classMates1 := make(map[int]string)

 // 添加映射关系
 classMates1[0] = "小明"
 classMates1[1] = "小红"
 classMates1[2] = "小张"

 // 根据 key 获取 value
 fmt.Printf("id %v is %v\n", 1, classMates1[1])

 // 在声明时初始化数据
 classMates2 := map[int]string{
  0 : "小明",
  1 : "小红",
  2 : "小张",
 }

 fmt.Printf("id %v is %v\n", 3, classMates2[3])

}

如上代码所示,我们可以使用 make 函数构造好对应的 map 之后,再使用键值对的方式为 map 添加成员,也可以直接在声明时通过类 JSON 格式进行内容定义。可以通过键直接查询对应的值,如果不存在这样的键,将会返回值类型的默认值。可以采用以下的方式来查询某个键是否存在于 map 中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mate,ok := classMate2[1]

如果键存在于 map 中,布尔型 ok 将会是 true

容器遍历

Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。

遍历对于很多 Golang 的内置容器来说,形式都是基本一致的,主要通过 for-range 语法,我们将通过以下的例子分别展示数组、切片和字典的遍历过程,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main()  {

 // 数组的遍历
 nums := [...]int{1,2,3,4,5,6,7,8}
 for k, v:= range nums{
  // k 为下标,v 为对应的值
  fmt.Println(k, v, " ")
 }

 fmt.Println()

 // 切片的遍历
 slis := []int{1,2,3,4,5,6,7,8}
 for k, v:= range slis{
  // k 为下标,v 为对应的值
  fmt.Println(k, v, " ")
 }

 fmt.Println()

 // 字典的遍历
 tmpMap := map[int]string{
  0 : "小明",
  1 : "小红",
  2 : "小张",
 }

 for k, v:= range tmpMap{
  // k 为键值,v 为对应值
  fmt.Println(k, v, " ")
 }

}

通过 for-range 可以对数组、切片和字典以同样的方式进行遍历。如果仅需要遍历值,可以将不需要的键改为匿名变量形式,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for _, v := range nums {

仅遍历键时,可以直接省略掉无用值的赋值。在 for-range 遍历的过程中,因为键和值都是通过拷贝的方式进行赋值,对它们进行修改并不会影响到容器内成员的变化,这点需要我们在实际开发中多加注意。

在数组上使用 range 将传入 index 和值两个变量。当我们不需要使用该元素的序号,可以使用空白符"_"省略了。不过有些场景可能确实需要知道它的索引。

小结

本文主要介绍了列表与字典的基本使用,以及容器的遍历。go 语言中主要通过 for-range 语法,文中实际的案例分别展示了数组、切片和字典的遍历过程。Go 语言中提供了 list 列表和 Map 映射关系容器,这两种容器都是我们日常经常使用到的。list 的实现基于双向链表。而 Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 aoho求索 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go 语言入门系列:列表与字典
前面的文章主要介绍了 Go 容器的数组和切片的基本概念以及使用。切片是 Go 中提供了一种灵活,功能强悍的内置类型("动态数组")。与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。本文将会介绍列表与字典在 Go 语言中相关的使用。
aoho求索
2021/07/16
7800
Go 语言入门系列:数组的使用
前面的文章主要介绍了 Go 基于语法中的分支和循环控制结构。其中涉及到的 If 、Switch 和 for 等关键字,是我们日常编码所常用的。当我们在程序中操作大量同类型变量时,为了方便数据的存储和操作,我们需要借助容器的力量。本文我们将介绍 Go 容器:数组。
aoho求索
2021/07/16
4080
Go 语言入门系列:数组的使用
Go语言的容器 - Java技术债务
切片的零值是 nil 一个 nil 切片的长度和容量为 0,并且没有底层数组。切片可以包含任何类型,包括其他切片。
Java技术债务
2024/06/21
1540
Go 语言基础入门教程 —— 数据类型篇:字典类型的遍历和排序
这种遍历模式和我们在 PHP 中通过 foreach 对关联数组进行遍历很像,上述代码输出结果是:
学院君
2019/08/08
7300
Go 数据类型篇(七):字典使用入门与字典排序实现
有过 Redis 使用经验的同学应该很熟悉,所谓字典,其实就是存储键值对映射关系的集合,只不过对于强类型的 Go 语言来说,需要在声明时指定键和值的类型,此外,和 Redis 一样,Go 字典也是个无序集合,底层不会按照元素添加顺序维护元素的存储顺序。
学院君
2023/03/03
9520
Go 数据类型篇(七):字典使用入门与字典排序实现
Go 语言基础入门教程 —— 流程控制篇:循环语句
与其它编程语言不同的是,Go 语言中的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构。关键字 for 的基本使用方法与 PHP 类似,只是循环条件不含括号,比如我们要计算 1 到 100 之间所有数字之后,可以这么做:
学院君
2019/08/08
6150
Go基础系列 | 9. 内置集合 - map
map 是一种键(key)/值(value)对的无序集合,在其它语言中称为字典、关联数组、哈希表等。当给定了键可以快速定位到值,而且键必须唯一的,不能出现相同。
潇洒哥和黑大帅
2021/07/19
4370
Go基础系列 | 9. 内置集合 - map
3.Go编程快速入门学习
比如:var a [5]int, 数组的长度必须是常量,并且长度是数组类型的一部分。一旦定义,长度不能变。注意: [5]int和[10]int是不同的类型。
全栈工程师修炼指南
2022/09/29
4070
3.Go编程快速入门学习
go-map
Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。 map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。
新人小试
2020/03/05
3410
100天精通Golang(基础入门篇)——第12天:深入解析Go语言中的集合(Map)及常用函数应用
本文是《100天精通Golang(基础入门篇)》系列的第12天,主要深入解析Go语言中的集合(Map)及常用函数的应用。文章从介绍什么是Map开始,然后详细讲解了Map的使用方法,包括使用make()函数创建map、delete()函数的使用、ok-idiom的应用、获取map的长度以及map作为引用类型的特点。此外,还提供了多个综合代码案例,帮助读者更好地理解和应用所学知识。通过本文的学习,读者将对Go语言中的集合(Map)有更深入的了解。
猫头虎
2024/04/08
2910
100天精通Golang(基础入门篇)——第12天:深入解析Go语言中的集合(Map)及常用函数应用
Go:学习笔记兼吐槽(3)
长度是数组类型的一部分,就是说数组不可以脱离长度而存在。听起来不太明白,我们来看下面的一个示例就明白了,这真的是一个大坑。
丹枫无迹
2019/03/05
6270
golang有序map_go语言发展不起来
这个实现方法的主要的方法是用空间换取时间。通过list 和 map 两种数据结构,保存相同的一份数据。list 用来做顺序遍历,map 用来做查找,删除操作。
全栈程序员站长
2022/09/27
3110
深入理解python中的for循环
for语句实际上解决的是循环问题。在很多的高级语言中都有for循环(for loop)。for语句是编程语言中针对可迭代对象的语句,它的主要作用是允许代码被重复执行。看一段来自维基百科的介绍:
皮大大
2023/08/23
4470
[Go语言]实现可以枚举的map
在golang-nuts上看到有人问怎么样去枚举一个map。在go语言层面,并不支持支持枚举map,也就是说你不能获得一个枚举器在任意时刻去枚举这个map,只能用range一次性地遍历这个map。但是我们可以用map+list的方式来实现一个可以枚举的map。请看代码: import ( "container/list" "fmt" ) type Iterator struct { e *list.Element } func (p *Iterator) Valid() bool { return p
李海彬
2018/03/22
1.9K0
Go 控制结构篇:条件语句、分支语句、循环语句和跳转语句
流程控制主要用于设定计算执行的次序,建立程序的逻辑结构。Go 语言的流程控制和其他编程语言类似,支持如下几种流程控制语句:
学院君
2023/03/03
1.6K0
Go 控制结构篇:条件语句、分支语句、循环语句和跳转语句
Go 语言基础入门教程 —— 数据类型篇:字典类型及其基本使用
有 PHP 基础的同学都应该知道,PHP 数组包含索引数组和关联数组,PHP 中的索引数组即对应 Go 语言的数组和切片类型,PHP 中的关联数组即对应 Go 语言中的字典类型(map),所谓字典,其实就是存储键值对映射关系的集合,只不过对于强类型的 Go 语言来说,与 PHP 关联数组的不同之处在于需要在声明时指定键和值的类型,此外 Go 字典是个无序集合,底层不会像 PHP 那样按照元素添加顺序维护元素的存储顺序。
学院君
2019/08/08
1.2K0
Go语言学习笔记——常用关键字
for...range完成数据迭代,支持字符串、数组、数组指针、切片、字典、通道类型,返回索引、键值数据。
windealli
2024/04/15
1540
Go语言学习笔记——常用关键字
【愚公系列】2022年07月 Go教学课程 023-Go容器之列表
列表是一种数据结构,由多元素成的有限序列,即按照一定的线性顺序排列而成的数据项的集合,在这种数据结构上可以进行元素的的插入,删除,修改,和查找。
愚公搬代码
2022/08/01
2230
【愚公系列】2022年07月 Go教学课程 023-Go容器之列表
Go语言学习笔记——常用关键字
for...range完成数据迭代,支持字符串、数组、数组指针、切片、字典、通道类型,返回索引、键值数据。
windealli
2024/04/10
1560
Go语言学习笔记——常用关键字
Go语言入门——基础语法篇(二)
Go的语句是可以省略;结束符的,且每行尽可能只写一句代码,这是Go语言的编程范式,因此应遵循规范,不要加分号。分号只在一种情况下是必须的,当一行写了多个代码语句,则每个语句必须使用分号分隔。
arcticfox
2019/08/02
7900
Go语言入门——基础语法篇(二)
相关推荐
Go 语言入门系列:列表与字典
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验