前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2013年02月06日 Go生态洞察:Go中的映射(Map)实战 ️

2013年02月06日 Go生态洞察:Go中的映射(Map)实战 ️

作者头像
猫头虎
发布2024-04-09 15:24:15
780
发布2024-04-09 15:24:15
举报
文章被收录于专栏:猫头虎博客专区

2013年02月06日 Go生态洞察:Go中的映射(Map)实战 🗺️

摘要

🐾 你好,这里是猫头虎博主!今天我们将深入探索Go语言中的一种极其有用的数据结构——映射(Map)。如果你对“Go中的映射使用”或“Go数据结构”感兴趣,这篇文章正适合你。我们将详细讲解映射的声明、初始化、操作,以及如何在Go代码中高效利用映射。让我们一起揭开Go映射的神秘面纱吧!

引言

在计算机科学中,哈希表是一种极其有用的数据结构,以其快速查找、添加和删除的特性而著称。Go语言提供了内置的映射类型,实现了哈希表的功能。本文将重点介绍如何在Go中使用映射,而非其底层实现。

正文

📌 声明和初始化

Go中的映射类型格式如下:

代码语言:javascript
复制
map[KeyType]ValueType

这里的KeyType是可比较的类型,而ValueType可以是任何类型,甚至是另一个映射。

例如,声明一个字符串到整数的映射:

代码语言:javascript
复制
var m map[string]int

映射是引用类型,使用make函数进行初始化:

代码语言:javascript
复制
m = make(map[string]int)
🛠️ 使用映射

在Go中操作映射的语法非常直观。例如,设置键"route"的值为66

代码语言:javascript
复制
m["route"] = 66

读取键"route"的值:

代码语言:javascript
复制
i := m["route"]

如果键不存在,将返回值类型的零值。例如,int类型的零值为0

代码语言:javascript
复制
j := m["root"]
// j == 0

使用len函数获取映射中的项数:

代码语言:javascript
复制
n := len(m)

使用delete函数从映射中删除一个条目:

代码语言:javascript
复制
delete(m, "route")

检查键是否存在:

代码语言:javascript
复制
i, ok := m["route"]

使用range关键字遍历映射:

代码语言:javascript
复制
for key, value := range m {
    fmt.Println("Key:", key, "Value:", value)
}

使用映射字面量初始化映射:

代码语言:javascript
复制
commits := map[string]int{
    "rsc": 3711,
    "r":   2138,
    "gri": 1908,
    "adg": 912,
}
🌟 零值的利用

当映射检索未找到时返回零值,这在某些情况下非常方便。

例如,布尔值映射可用作类似集合的数据结构。下面的例子遍历了Node类型的链表,并用映射来检测循环。

代码语言:javascript
复制
type Node struct {
    Next  *Node
    Value interface{}
}
var first *Node

visited := make(map[*Node]bool)
for n := first; n != nil; n = n.Next {
    if visited[n] {
        fmt.Println("cycle detected")
        break
    }
    visited[n] = true
    fmt.Println(n.Value)
}
🗝️ 映射的键类型

映射的键可以是任何可比较的类型。这包括布尔型、数值型、字符串、指针、通道和接口类型,以及仅包含这些类型的结构体或数组。不包括的类型有切片、映射和函数;这些类型不能使用==进行比较,也不能作为映射键。

🔄 并发与映射

映射

在并发使用时不是安全的。如果需要从并发执行的goroutine中读写映射,必须使用某种同步机制,如sync.RWMutex

代码语言:javascript
复制
var counter = struct{
    sync.RWMutex
    m map[string]int
}{m: make(map[string]int)}
🔁 迭代顺序

使用range循环迭代映射时,迭代顺序不确定,也不保证每次迭代都相同。如果需要稳定的迭代顺序,必须维护一个指定该顺序的单独数据结构。

代码语言:javascript
复制
import "sort"

var m map[int]string
var keys []int
for k := range m {
    keys = append(keys, k)
}
sort.Ints(keys)
for _, k := range keys {
    fmt.Println("Key:", k, "Value:", m[k])
}
📈 知识点总结

功能

说明

映射声明和初始化

make函数初始化映射

映射操作

设置、读取、删除映射条目

零值利用

映射检索未找到时返回零值的应用

映射键类型

可比较类型可作为映射键

并发使用映射

使用同步机制管理并发访问

迭代顺序

range循环的迭代顺序不确定

总结

Go中的映射是一种强大且灵活的数据结构,适用于许多不同的编程场景。了解映射的工作方式和最佳实践对于编写高效、可读的Go代码至关重要。本文被猫头虎的Go生态洞察专栏收录,详情点击这里

参考资料

  • Gerrand, A. (2013). Go maps in action. Retrieved from Go Blog
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2013年02月06日 Go生态洞察:Go中的映射(Map)实战 🗺️
    • 摘要
      • 引言
        • 正文
          • 📌 声明和初始化
          • 🛠️ 使用映射
          • 🌟 零值的利用
          • 🗝️ 映射的键类型
          • 🔄 并发与映射
          • 🔁 迭代顺序
          • 📈 知识点总结
        • 总结
          • 参考资料
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档