前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go 语言之 Maps 详解:创建、遍历、操作和注意事项

Go 语言之 Maps 详解:创建、遍历、操作和注意事项

原创
作者头像
小万哥
修改于 2023-12-03 12:57:29
修改于 2023-12-03 12:57:29
2920
举报
文章被收录于专栏:程序人生丶程序人生丶

Maps用于以键值对的形式存储数据值。Maps中的每个元素都是一个键值对。Maps是一个无序且可更改的集合,不允许重复。Maps的长度是其元素的数量。您可以使用 len() 函数来查找长度。Maps的默认值是 nil。Maps保存对底层哈希表的引用。

Go语言有多种方法来创建Maps。

使用 var 和 := 语法创建Maps

代码语言:go
AI代码解释
复制
var a = map[KeyType]ValueType{key1:value1, key2:value2,...}
b := map[KeyType]ValueType{key1:value1, key2:value2,...}

示例

以下示例展示了如何在Go中创建Maps。请注意代码中和输出中的顺序。

代码语言:go
AI代码解释
复制
package main
import ("fmt")

func main() {   
  var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}   
  b := map[string]int{"Oslo": 1, "Bergen": 2, "Trondheim": 3, "Stavanger": 4}

  fmt.Printf("a\t%v\n", a)   
  fmt.Printf("b\t%v\n", b)
}

结果:

代码语言:go
AI代码解释
复制
a   map[brand:Ford model:Mustang year:1964]
b   map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]

注意:代码中定义的Maps元素的顺序与它们存储的方式不同。数据以一种能够从Maps中高效检索数据的方式存储。

使用 make() 函数创建Maps

代码语言:go
AI代码解释
复制
var a = make(map[KeyType]ValueType)
b := make(map[KeyType]ValueType)

示例

以下示例展示了如何使用 make() 函数在Go中创建Maps。

代码语言:go
AI代码解释
复制
package main
import ("fmt")

func main() {   
  var a = make(map[string]string) // Maps 现在为空   
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"
                                 // a 不再为空   
  b := make(map[string]int)   
  b["Oslo"] = 1   
  b["Bergen"] = 2   
  b["Trondheim"] = 3   
  b["Stavanger"] = 4

  fmt.Printf("a\t%v\n", a)   
  fmt.Printf("b\t%v\n", b)
}

结果:

代码语言:go
AI代码解释
复制
a   map[brand:Ford model:Mustang year:1964]
b   map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]

创建一个空Maps

创建空Maps有两种方式。一种是使用 make() 函数,另一种是使用以下语法。

代码语言:go
AI代码解释
复制
var a map[KeyType]ValueType

注意:使用 make() 函数是创建空Maps的正确方式。如果以不同的方式创建空Maps并写入它,将会引发运行时错误。

示例

以下示例演示了使用 make() 函数和不使用 make() 函数声明空Maps的区别。

代码语言:go
AI代码解释
复制
package main
import ("fmt")

func main() {   
  var a = make(map[string]string)   
  var b map[string]string

  fmt.Println(a == nil)   
  fmt.Println(b == nil)
}

结果:

代码语言:go
AI代码解释
复制
false
true

允许的键类型

Maps键可以是任何定义了等号运算符(==)的数据类型,包括:

  • 布尔值
  • 数字
  • 字符串
  • 数组
  • 指针
  • 结构体
  • 接口(只要动态类型支持等号运算)

不允许的键类型包括:

  • 切片
  • Maps
  • 函数

这些类型是不允许的,因为它们不支持等号运算(==)。

允许的值类型

Maps的值可以是任何类型。

访问Maps元素

您可以通过以下方式访问Maps元素:

代码语言:go
AI代码解释
复制
value = map_name[key]

示例

以下示例演示了如何访问Maps元素。

代码语言:go
AI代码解释
复制
package main
import ("fmt")

func main() {   
  var a = make(map[string]string)   
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"

  fmt.Printf(a["brand"])
}

结果:

代码语言:go
AI代码解释
复制
Ford

更新和添加Maps元素

要更新或添加元素,可以使用以下方式:

代码语言:go
AI代码解释
复制
map_name[key] = value

示例

以下示例演示了如何更新和添加元素到Maps中。

代码语言:go
AI代码解释
复制
package main
import ("fmt")

func main() {   
  var a = make(map[string]string)   
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"

  fmt.Println(a)

  a["year"] = "1970" // 更新元素   
  a["color"] = "red" // 添加元素

  fmt.Println(a)
}

结果:

代码语言:go
AI代码解释
复制
map[brand:Ford model:Mustang year:1964]
map[brand:Ford color:red model:Mustang year:1970]

从Maps中删除元素删除元素使用delete()函数。

语法

delete(map_name, key)

示例

代码语言:go
AI代码解释
复制
package main
import ("fmt")

func main() {
  var a = make(map[string]string)
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"

  fmt.Println(a)

  delete(a, "year")

  fmt.Println(a)
}

结果

代码语言:text
AI代码解释
复制
map[brand:Ford model:Mustang year:1964] map[brand:Ford model:Mustang]

检查Maps中特定元素的存在 您可以使用以下语法检查Maps中是否存在特定键:

语法 val, ok := map_name[key]

如果只想检查特定键的存在,可以在val的位置使用下划线(_)。

示例

代码语言:go
AI代码解释
复制
package main
import ("fmt")

func main() {
  var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964", "day": ""}

  val1, ok1 := a["brand"] // 检查现有键及其值
  val2, ok2 := a["color"] // 检查不存在的键及其值
  val3, ok3 := a["day"]   // 检查现有键及其值
  _, ok4 := a["model"]    // 仅检查存在的键而不检查其值

  fmt.Println(val1, ok1)
  fmt.Println(val2, ok2)
  fmt.Println(val3, ok3)
  fmt.Println(ok4)
}

结果

代码语言:text
AI代码解释
复制
Ford true  false  true true

Maps是引用 Maps是对哈希表的引用。

如果两个Maps变量引用同一个哈希表,则更改一个变量的内容会影响另一个变量的内容。

示例

代码语言:go
AI代码解释
复制
package main
import ("fmt")

func main() {
  var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}
  b := a

  fmt.Println(a)
  fmt.Println(b)

  b["year"] = "1970"
  fmt.Println("更改b后:")

  fmt.Println(a)
  fmt.Println(b)
}

结果

代码语言:text
AI代码解释
复制
map[brand:Ford model:Mustang year:1964] map[brand:Ford model:Mustang year:1964]
更改b后:
map[brand:Ford model:Mustang year:1970] map[brand:Ford model:Mustang year:1970]

**遍历Maps **您可以使用range来遍历Maps。

示例 以下示例显示了如何遍历Maps中的元素。请注意输出中元素的顺序。

代码语言:go
AI代码解释
复制
package main
import ("fmt")

func main() {
  a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}

  for k, v := range a {
    fmt.Printf("%v : %v, ", k, v)
  }
}

结果

代码语言:text
AI代码解释
复制
two : 2, three : 3, four : 4, one : 1,

按特定顺序遍历Maps。Maps是无序的数据结构。如果需要按特定顺序遍历Maps,则必须使用单独的数据结构来指定该顺序。

示例 以下示例演示了如何按特定顺序遍历Maps中的元素。

代码语言:go
AI代码解释
复制
package main
import ("fmt")

func main() {
  a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}

  var b []string // 定义顺序
  b = append(b, "one", "two", "three", "four")

  for k, v := range a { // 无序循环
    fmt.Printf("%v : %v, ", k, v)
  }

  fmt.Println()

  for _, element := range b { // 使用定义的顺序循环
    fmt.Printf("%v : %v, ", element, a[element])
  }
}

结果

代码语言:text
AI代码解释
复制
two : 2, three : 3, four : 4, one : 1,
one : 1, two : 2, three : 3, four : 4,

最后

看完如果觉得有帮助,欢迎 点赞、收藏、关注

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
DeepSeek 全面指南:95% 的人都不知道的9个技巧(建议收藏)
其实问题不在工具,很多人的使用姿势就搞错了,用大炮打蚊子,白白浪费DeepSeek的强大功能。
用户1220090
2025/02/03
5.1K0
DeepSeek 全面指南:95% 的人都不知道的9个技巧(建议收藏)
使用DeepSeek必备的10个技巧
今天,我们直接讲干货。用10个问题带大家了解:DeepSeek是什么,怎么用,如何与DS高质量对话,以及一些隐藏技巧。
崔认知
2025/02/06
1.8K0
使用DeepSeek必备的10个技巧
DeepSeek 新手使用指南:入门必备技巧与隐藏功能(建议收藏)
2025年春节过的好快,转眼间,大家又回到了各自工作岗位了,要说这个春节,什么最火,肯定绕不开DeepSeek。
测试开发技术
2025/02/10
1.7K0
DeepSeek 新手使用指南:入门必备技巧与隐藏功能(建议收藏)
全网最全DeepSeek保姆级攻略!这几个隐藏功能让工作效率翻倍
DeepSeek是由深度求索(DeepSeek AI)开发的一系列先进的人工智能模型,涵盖自然语言处理、代码生成、数学推理等多个领域,并以其高性能、高性价比和开源策略在业界脱颖而出。
AI研思录
2025/02/20
3350
全网最全DeepSeek保姆级攻略!这几个隐藏功能让工作效率翻倍
DeepSeek爆了,问问它《哪吒2》今年为啥爆火
最近,国产大模型 DeepSeek 因其惊人的文本生成以及推理能力(深度思考)在 AI 界刷屏,并且《哪吒 2》也勇夺国产电影票房冠军。
wayn
2025/02/08
1700
DeepSeek爆了,问问它《哪吒2》今年为啥爆火
2025最新DeepSeek使用建议指南及实用技巧分享(建议收藏)
这几天,估计大多数人都听说过 DeepSeek(以下简称 DS)了,但真的有去亲身体验过的,估计一半人都不到,大多都只是"道听途说"式地了解了一下 DS 的神奇。
宫水三叶的刷题日记
2025/02/05
3.4K0
2025最新DeepSeek使用建议指南及实用技巧分享(建议收藏)
DeepSeek 精准使用提示词技巧和闭坑指南
这篇文章主要介绍了 DeepSeek 的精准使用提示词技巧和闭坑指南。包括基本使用方法,如深度思考、联网搜索、上传附件等功能的应用场景。提示词方面,强调精准高效提问,如明确需求、不定义过程、明确受众风格等技巧,还提到了反馈与迭代优化、复杂问题分步拆解等。闭坑指南包括避免冗长提示词、复杂句式等。
stark张宇
2025/03/02
1.2K3
爆火的DeepSeek,你真的会用吗?
最近,AI 界可是被一个名字 “霸屏” 啦,它就是DeepSeek!这货简直像一颗突然冒出来的超级巨星,在全球范围内掀起了一阵 “龙卷风”。不管是刷社交媒体,还是逛科技论坛,到处都能看到大家在热烈讨论 DeepSeek。短短时间,它的下载量就像坐了火箭一样 “蹭蹭” 往上涨,直接在全球 140 多个市场的应用商店排行榜上 “C 位出道”,连曾经风光无限的 ChatGPT 在它面前都有点 “黯然失色” 了。
小码农薛尧
2025/02/12
950
爆火的DeepSeek,你真的会用吗?
DeepSeek告诉我:程序员在AI时代不必焦虑
一、AI焦虑的本质:程序员为何担心被取代? 凌晨2点,程序员小王对着屏幕发呆。GitHub Copilot刚帮他自动补全了代码,但看着一行行自动生成的函数,他
方才编程_公众号同名
2025/02/04
7.2K2
DeepSeek告诉我:程序员在AI时代不必焦虑
当“超越”变成空话:为什么我们总能看到xx大模型超越了deepseek?
3月16日百度文心大模型4.5与X1正式发布,我看到了一篇技术文章,声称其超越了deepseek,当我看具体内容的时候,发现仅仅是和deepseekR1做口头比较,不分维度,不分视角,就一个单纯的超过,缺乏可信度,我并不是说一定谁强谁弱,但是技术博文应该紧扣技术内容,而不是放空话、大话,要么前瞻理论,要么当下实践,别的都是空谈。
watermelo37
2025/03/19
570
当“超越”变成空话:为什么我们总能看到xx大模型超越了deepseek?
V3 vs R1:DeepSeek 两大模型如何选择?| 送书福利
推理型模型, 提示词依赖程度弱,只要能表达清楚需求、任务和目的,R1 会“揣摩”提示词背后你想要什么。
深度学习与Python
2025/03/17
1960
V3 vs R1:DeepSeek 两大模型如何选择?| 送书福利
DeepSeek的提示词技巧,就是没有技巧。
几乎一夜之间,所有人都在关注DeepSeek,甚至我在老家,完全没用过AI的七大姑八大姨,都在问我,DeepSeek是什么,怎么用。
数字生命卡兹克
2025/04/14
830
DeepSeek的提示词技巧,就是没有技巧。
秒懂!DeepSeek提示词手册
DeepSeek在处理复杂任务时,通过结构化提示词提高输出质量的方法主要体现在以下几个方面:
疯狂的KK
2025/02/06
4.2K0
秒懂!DeepSeek提示词手册
DeepSeek vs ChatGPT:AI对决中的赢家是……人类吗?
当今人工智能(AI)AIGC领域,DeepSeek 和 ChatGPT 吸引了众多目光。
猫头虎
2025/02/10
5180
DeepSeek vs ChatGPT:AI对决中的赢家是……人类吗?
【AGI-Eval学习干货 NO.2】DeepSeek小白必看指南,隐藏1000个提示词参考(建议收藏)
这个热搜#博主卖 DeepSeek 相关课程 1 天收入 50000#,我看到之后感觉得做一期干货内容,DeepSeek 的玩法现在都在摸索阶段,和大家一起学习探索。
AGI-Eval评测社区
2025/03/14
1290
【AGI-Eval学习干货 NO.2】DeepSeek小白必看指南,隐藏1000个提示词参考(建议收藏)
【人工智能】学会表达自己的需求是用好DeepSeek R1的关键
经过前面的内容,相信大家都已经认识了什么是推理模型,什么是通用模型,以及如何选择适合自己的模型。
蒙奇D索隆
2025/02/16
1250
【人工智能】学会表达自己的需求是用好DeepSeek R1的关键
人工智能入门与高效使用DeepSeek的提示词指南
本文将分享一些使用 AI 和 DeepSeek 的技巧,帮助你更好地利用这些工具,提高效率。
星哥玩云
2025/03/03
1370
人工智能入门与高效使用DeepSeek的提示词指南
【人工智能】学会表达自己的需求是用好DeepSeek R1的关键
经过前面的内容,相信大家都已经认识了什么是推理模型,什么是通用模型,以及如何选择适合自己的模型。
蒙奇D索隆
2025/02/15
1730
【人工智能】学会表达自己的需求是用好DeepSeek R1的关键
【AGI-Eval行业干货 NO.2】DeepSeek使用必看指南,隐藏1000个提示词参考(建议收藏)
昨天,一款热搜词条#博主卖 DeepSeek 相关课程 1 天收入 50000 元#引起热议。看了热搜描述的课程内容,我感觉最近各路媒体发的公众号干货内容不得赚它个10万8万的,真不至于花钱,今天免费给大家提供一些玩法和思路,不花钱的干货才是最香的。
AGI-Eval评测社区
2025/02/19
1170
【AGI-Eval行业干货 NO.2】DeepSeek使用必看指南,隐藏1000个提示词参考(建议收藏)
【人工智能】DeepSeek R1的链式思维
上一篇我们介绍了 DeepSeek R1 的大语言模型类别——推理型大语言模型。因此我们也知道了 DeepSeek R1 是擅长处理逻辑密度高的任务。
蒙奇D索隆
2025/02/13
2980
【人工智能】DeepSeek R1的链式思维
推荐阅读
相关推荐
DeepSeek 全面指南:95% 的人都不知道的9个技巧(建议收藏)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档