从零学 Go:列表与字典

举报
aoho 发表于 2021/09/26 19:10:54 2021/09/26
【摘要】 前文回顾前面的文章主要介绍了 Go 容器的数组和切片的基本概念以及使用。本文将会介绍列表与字典在 Go 语言中相关的使用。 列表与字典Golang 的列表通过双向链表的方式实现,能够高效进行元素的插入和删除操作。列表的初始化样式如下所示:var name list.List// orname := list.New()我们可以直接声明初始化列表,也可以使用 container/list 包...

前文回顾

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

列表与字典

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

var name list.List
// or
name := list.New()

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

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

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 的样式如下所示:

name := make(map[keyType]valueType)

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

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 中:

mate,ok := classMate2[1]

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

小结

本文主要介绍了列表与字典的基本使用,Go 语言中提供了 list 列表和 Map 映射关系容器,这两种容器都是我们日常经常使用到的。list 的实现基于双向链表。而 Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

下面的文章,我们将继续介绍容器相关的知识:容器的遍历。

阅读最新文章,关注公众号:aoho求索

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。