0

Go 基础篇之 Map

 1 year ago
source link: https://studygolang.com/articles/36055
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Go 基础篇之 Map

webff · 大约9小时之前 · 183 次点击 · 预计阅读时间 3 分钟 · 大约8小时之前 开始浏览    

Go 语言是一门非常流行的开源编程语言,它的语法简单易学,同时也具有出色的性能表现。其中,Map 是 Go 语言中的一种数据结构,它可以用来存储键值对。今天我们来聊聊 Map,我将介绍一些关于 Go 语言中 Map 的基本知识和高级用法。

1. Map 基础知识

1.1 什么是 Map

在 Go 语言中,Map 是一种无序的键值对数据结构。它类似于Python中的字典,C++ 中的 Map,Java 中的HashMap 等。Map 中的每个元素都包含一个键和一个值。键必须是唯一的,而值则可以重复。

1.2 声明一个 Map

在 Go 语言中,可以使用 make 函数来创建一个 Map。make 函数需要传递两个参数,第一个参数是 Map 的类型,第二个参数是 Map 的初始大小。Map 的类型可以使用 Map 关键字来定义,例如:

// 创建一个类型为map[string]int的map,初始大小为10
m := make(map[string]int, 10)

上述代码将创建一个类型为 Map[string]int的 Map,其中键为字符串类型,值为整数类型。初始大小为10,这个值可以根据实际需要进行调整。

1.3 添加元素到 Map 中

可以使用赋值操作符来向 Map 中添加元素。例如:

// 向map中添加元素
m["one"] = 1
m["two"] = 2

上述代码将向 Map 中添加两个元素,键为"one" 和 "two",值分别为 1 和 2。

1.4 Map 中获取元素

可以使用下标操作符来从Map中获取元素。例如:

// 从map中获取元素
fmt.Println(m["one"])
fmt.Println(m["two"])

上述代码将输出 Map 中键为 "one" 和 "two" 的值。

需要注意的是,如果 Map 中不存在指定的键,则会返回该值类型的零值。因此,在获取 Map 中的元素之前,需要先判断该元素是否存在。

1.5 遍历 Map

可以使用 for 循环来遍历 Map 中的所有元素。在每次循环中,将会返回当前元素的键和值。例如:

// 遍历map中的元素
for key, value := range m {
    fmt.Println(key, value)
}

上述代码将输出Map中所有元素的键和值。

2. Map 高级用法

在 Go 语言中,Map 是一种非常重要的数据结构,它可以让我们快速地存储和检索数据。除了基本操作之外,Map 还具有一些高级用法,本文将介绍这些高级用法。

2.1 Map 的零值

在 Go 语言中,如果我们声明一个 Map 却没有给它赋值,那么它的值将是 nil。但是,在使用 Map 前,我们应该将它初始化,以免出现意外错误。可以使用 make() 函数来初始化 Map。例如:

m := make(map[string]int)

这里,我们创建了一个名为 m 的 Map,它的键是字符串类型,值是整型。

2.2 Map 的长度

我们可以使用 len() 函数获取 Map 的长度,即其中元素的数量。例如:

m := make(map[string]int)
m["foo"] = 42
m["bar"] = 13
fmt.Println(len(m))

这将输出 2,因为 m 中有两个元素。

2.3 Map 的删除

我们可以使用 delete() 函数从 Map 中删除元素。delete() 函数接受两个参数:要删除元素的 Map 和要删除元素的键。例如:

m := make(map[string]int)
m["foo"] = 42
delete(m, "foo")

这将从 Map 中删除名为 "foo" 的键。

2.4 Map 的并发安全性

在多个 Goroutine 中使用 Map 时,我们需要注意 Map 的并发安全性。多个 Goroutine 对同一个 Map 进行读写操作时,可能会导致竞争条件和数据竞争等问题。为了解决这些问题,Go 语言提供了 sync 包中的 Map 类型。sync.Map 类型可以安全地在多个 Goroutine 中使用。例如:

var m sync.Map
m.Store("foo", 42)
value, ok := m.Load("foo")

这里,我们使用 sync.Map 类型创建了名为 m 的 Map,向其中添加了一个名为 "foo" 的键,值为 42。然后,我们使用 Load() 方法从 Map 中读取 "foo" 键的值。

2.5 Map 的值为函数

在 Map 中,值可以是函数。这种用法非常实用,可以让我们更加灵活地编写代码。例如,我们可以使用 Map 来存储不同的操作,然后根据需要调用这些操作:

var operations = map[string]func(int, int) int {
    "add": func(a, b int) int { return a + b },
    "sub": func(a, b int) int { return a - b },
    "mul": func(a, b int) int { return a * b },
}

result := operations["add"](3, 4)

这里,我们创建了一个 Map,它的键是字符串,值是函数类型。然后,我们可以使用这些函数来执行不同的操作,如计算加法、减法、乘法等。

在本文中,我们学习了 Map 的基础知识和高级用法,包括 Map 定义的 零值、Map 的长度和 sync.Map

欢迎点赞、关注,感谢!

微信.png


有疑问加站长微信联系(非本文作者))

280

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK