当前位置: 首页 > news >正文

【Golang】Go语言Map数据类型

Go语言Map数据类型

文章目录

  • Go语言Map数据类型
    • 一、Map
      • 1.1.1、map定义
      • 1.1.2、map的基本使用
      • 1.1.3、判断某个键是否存在
      • 1.1.4、map的遍历
      • 1.1.5、使用delete()函数删除键值对
      • 1.1.6、按照指定顺序遍历map
      • 1.1.7、元素为map类型的切片
      • 1.1.8、值为切片类型的map

一、Map

  • map是一种无序的基本key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

1.1.1、map定义

  • Go语言中map的定义语法如下
map[keytype]valuetype
  • 其中
keytype: 表示键的类型
valuetype: 表示值的类型
  • map类型的变量默认初始值为nil,需要使用make()来分配内存。
  • 语法如下
make(map[keytype]valuetype, [cap])
  • 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其执行一个合适的容量。

1.1.2、map的基本使用

  • map中的数据都是成对出现的,map的基本使用示例代码如下:
func main() {scoreMap := make(map[string]int, 8)scoreMap["张三"] = 90scoreMap["小明"] = 100fmt.Println(scoreMap)fmt.Println(scoreMap["小明"])fmt.Printf("tyoe of a:%T\n", scoreMap)}
  • 结果如下
map[小明:100 张三:90]
100
tyoe of a:map[string]int
  • map也支持在声明的时候填充元素,例如
func main() {userInfo := map[string]string{"username": "admin","password": "admin@123",}fmt.Println(userInfo)  // map[password:admin@123 username:admin]fmt.Println(userInfo["username"])  // admin fmt.Println(userInfo["password"])  // admin@123}

1.1.3、判断某个键是否存在

  • Go语言中有个判断map中键是否存在的特俗写法,格式如下:
# value: 将会获得这个map的值
# ok: 如果key存在那么ok的值就是true否者为false
value, ok := map[key]
  • 举个例子:
func main() {userInfo := map[string]string{"username": "admin","password": "admin@123",}// 如果key存在ok为true, v为对应key的值; 不存在ok为false, v为值类型的零值v, ok := userInfo["username"]if ok {fmt.Println(v)} else {fmt.Println("查无此人")}}

1.1.4、map的遍历

  • Go语言中使用for range遍历map
func main() {scoremap := make(map[string]int)scoremap["张三"] = 90scoremap["小明"] = 100scoremap["王五"] = 60for k, v := range scoremap {fmt.Printf("key: %s value: %d\n", k, v)}}
  • 但我们只想遍历key的时候,可以按照下面的写法:
func main() {scoremap := make(map[string]int)scoremap["张三"] = 90scoremap["小明"] = 100scoremap["王五"] = 60for k := range scoremap {fmt.Printf(k)}}
  • 注意:遍历map时的元素顺序与添加键值对的顺序毫无关系

1.1.5、使用delete()函数删除键值对

  • 使用delete()内建函数从map中删除一组键值对,delete()函数的格式如下:
delete(map, key)
  • 其中
map: 表示要删除键值对的map
key: 表示要删除的键值对的key
  • 示例代码如下
func main() {scoremap := make(map[string]int)scoremap["张三"] = 90scoremap["小明"] = 100scoremap["王五"] = 60delete(scoremap, "小明")for k, v := range scoremap {fmt.Printf(k, v)}}

1.1.6、按照指定顺序遍历map

func main() {rand.Seed(time.Now().UnixNano()) // 初始化随机种子var scoreMap = make(map[string]int, 200)for i := 0; i < 100; i++ {key := fmt.Sprintf("stu%02d", i) // 生成stu开发的字符串value := rand.Intn(100)          // 生成0-99的随机整数scoreMap[key] = value}// 取出map中的所有key存入切片keysvar keys = make([]string, 0, 200)for key := range scoreMap {keys = append(keys, key)}// 对切片进行排序sort.Strings(keys)for _, key := range keys {fmt.Println(key, scoreMap[key])}}

1.1.7、元素为map类型的切片

  • 下面的代码演示了切片中的元素为map类型时的操作
func main() {// 使用make初始化一个map类型的切片var mapSlice = make([]map[string]string, 3)for index, value := range mapSlice {fmt.Printf("index: %d value: %v\n", index, value)}fmt.Println("init data")// 在mapSlice这个切片的第0个位置, 创建一个容量为10的map,并进行赋值mapSlice[0] = make(map[string]string, 10)mapSlice[0]["name"] = "王五"mapSlice[0]["password"] = "123456"mapSlice[0]["address"] = "红旗大街"for index, value := range mapSlice {fmt.Printf("index: %d value: %v\n", index, value)}}

1.1.8、值为切片类型的map

  • 下面的代码演示了map中值为切片类型的操作
func main() {var sliceMap = make(map[string][]string, 3)fmt.Println(sliceMap)fmt.Println("init data")key := "中国"value, ok := sliceMap[key]if !ok {value = make([]string, 0, 2)}value = append(value, "北京", "上海")sliceMap[key] = valuefmt.Println(sliceMap)
}
http://www.dtcms.com/a/303788.html

相关文章:

  • Qt 并行计算框架与应用
  • 【go】语言的匿名变量如何定义与使用
  • TDengine 中 TDgpt 异常检测的机器学习算法
  • spring data mongodb 入门使用手册
  • [Linux入门] Linux 部署本地 APT 仓库及 NFS 共享服务全攻略
  • Java -- String类-StringBuffer类-StringBuilder类
  • uniapp开发微信小程序(新旧版本对比:授权手机号登录、授权头像和昵称)
  • K-近邻算法(KNN算法)的K值的选取--交叉验证+网格搜索
  • 搭建专属AI聊天网站:NextChat + 蓝耘MaaS平台完整部署指南
  • 2025年7月技术问答第4期
  • 树形结构递归查询与嵌套结构转换:Flask + PostgreSQL 完整实现
  • 力扣面试150题--位1的个数
  • 【第四章自定义编辑器窗口_扩展默认的编辑器窗口_扩展Hierarchy窗口(7/11)】
  • QT项目 -仿QQ音乐的音乐播放器(第三节)
  • 深入理解 Qt 元对象系统 (Meta-Object System)
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析六
  • [明道云]-基础教学2-工作表字段 vs 控件:选哪种?
  • HTTP 与 HTTPS 的区别
  • mapbox进阶,mapbox-gl-draw绘图插件扩展,编辑模式支持点、线、面的捕捉
  • Objective-c 初阶——异常处理(try-catch)
  • 盛最多水的容器-双指针
  • 注册发送手机短信
  • bash变量名不能有连字符
  • Spark初探:揭秘速度优势与生态融合实践
  • RabbitMQ面试精讲 Day 7:消息持久化与过期策略
  • H.264视频的RTP有效载荷格式(翻译自:RFC6184 第5节 RTP有效载荷格式)
  • 网络协议——MPLS(多协议标签转发)
  • 力扣30 天 Pandas 挑战(3)---数据操作
  • LeetCode 283 - 移动零
  • CTF-Web学习笔记:服务端请求伪造(SSRF)篇