前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 语言入门系列:列表与字典及其遍历

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

作者头像
aoho求索
发布2021-08-06 15:21:12
2.7K0
发布2021-08-06 15:21:12
举报
文章被收录于专栏:aoho求索aoho求索

前文回顾

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

列表与字典

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

代码语言:javascript
复制
var name list.List
// or
name := list.New()

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

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

代码语言:javascript
复制
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
复制
name := make(map[keyType]valueType)

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

代码语言:javascript
复制
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
复制
mate,ok := classMate2[1]

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

容器遍历

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

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

代码语言:javascript
复制
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
复制
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前文回顾
  • 列表与字典
  • 容器遍历
  • 小结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档