Go基础语法:map

9 map

Go 语言中提供的映射关系容器为 map ,其内部使用 散列表(hash) 实现。它是一种无序的基于 key-value 的数据结构。

Go 语言中的 map 是引用类型,必须初始化之后才能使用。

9.1 map 定义

Go 语言中 map 的定义语法为:map[keyType]valueType,其中:

  • keyType 表示键的类型
  • valueType 表示值的类型

map 类型变量默认初始值为 nil (引用类型的默认初始值都为 nil), 需要使用 make() 函数来分配内存,语法格式为:

make(map[keyType]valueType , cap )

上述格式中,cap 表示 map 的容量,不是必须的,map 可以动态扩容。但我们通常会在初始化的时候就指定一个合适的容量,因为这样会比动态扩容的执行效率高。

package mainimport "fmt"func main() {// 声明一个键为 string 类型,值为 int 类型的 mapvar b map[string]int// truefmt.Println(nil == b)// 通过 make 初始化 map, 并指定其长度为 10。 map 可以自动扩容,但不如声明时指定容量的执行效率高。b = make(map[string]int, 10)b["aa"] = 100b["bb"] = 100//map[aa:100 bb:100]fmt.Println(b)
}

9.2 map 的基本使用

9.2.1 增值和取值

package mainimport "fmt"func main() {var b map[string]int// truefmt.Println(nil == b)b = make(map[string]int, 10)b["aa"] = 100b["bb"] = 100// 获取键对应的值时,使用 map名称[键名] 的格式fmt.Println(b["aa"])// 不确定是否存在某个键时,使用这种方式获取其值。ok 表示是否有该键,v 表示如果有该键时的值v, ok := b["cc"]if !ok {fmt.Println("b 中不存在键 cc")} else {fmt.Println("cc对应的值为:", v)}
}

9.2.1 删除某个键值对

删除时使用内置函数 delete, 该函数的定义如下:

func delete(m map[Type]Type1, key Type)

如果被删除的键存在,直接删除,不存在,则不执行任何操作。

package mainimport ("fmt"
)func main() {scoreMap := make(map[string]int, 10)scoreMap["张三"] = 93scoreMap["李四"] = 94scoreMap["王五"] = 95delete(scoreMap, "张三")
}

9.3 map 的遍历

9.3.1 for-range 遍历

package mainimport "fmt"func main() {scoreMap := make(map[string]int, 10)scoreMap["张三"] = 93scoreMap["李四"] = 94scoreMap["王五"] = 95for k, v := range scoreMap {fmt.Println(k, v)}
}

9.3.2 只遍历 key

package mainimport ("fmt"
)func main() {scoreMap := make(map[string]int, 10)scoreMap["张三"] = 93scoreMap["李四"] = 94scoreMap["王五"] = 95for k := range scoreMap {fmt.Println(k, scoreMap[k])}
}

9.3.3 只遍历 value

package mainimport ("fmt"
)func main() {scoreMap := make(map[string]int, 10)scoreMap["张三"] = 93scoreMap["李四"] = 94scoreMap["王五"] = 95for _, v := range scoreMap {fmt.Println(v)}
}

9.3.4 按照指定顺序遍历

Go 语言中没有 map 专用的排序,需要借助切片的排序实现。

package mainimport ("fmt""math/rand""sort""time"
)func main() {//初始化随机种子rand.Seed(time.Now().UnixNano())scoreMap := make(map[string]int, 150)for i := 0; i < 100; i++ {// 生成 stu 开头的字符串.此处的 %2d 表示使用两位数表示,不足两位则左边补0key := fmt.Sprintf("stu%02d", i)// 生成 0-99 的随机整数value := rand.Intn(100)scoreMap[key] = value}// 取出 map 中的所有 key 存入切片keys := make([]string, 0, 200)for k := range scoreMap {keys = append(keys, k)}// 对切片进行排序sort.Strings(keys)// 对排序后的切片进行遍历,并取 map 中的值for _, k := range keys {fmt.Println(k, scoreMap[k])}
}

9.4 其他相关

9.4.1 元素为 map 的切片

package mainimport ("fmt"
)func main() {// 构建一个切片,容量为 3,元素为 map[string]stringvar mapSlice = make([]map[string]string, 3)for index, v := range mapSlice {fmt.Printf("index:%d, value:%v \n", index, v)}fmt.Println()// 对切片中的元素进行初始化, 不初始化会报错——map、slice、channel 使用前必须初始化mapSlice[0] = make(map[string]string, 10)mapSlice[0]["name"] = "张三"mapSlice[0]["password"] = "123456"mapSlice[0]["address"] = "济南"for index, v := range mapSlice {fmt.Printf("index:%d, value:%v\n", index, v)}
}

运行结果如下:

index:0, value:map[] 
index:1, value:map[] 
index:2, value:map[] index:0, value:map[address:济南 name:张三 password:123456]
index:1, value:map[]
index:2, value:map[]

9.4.2 值为切片类型的 map

package mainimport "fmt"func main() {// 构建一个 map, 容量为 3,元素类型为 []string 切片var sliceMap = make(map[string][]string, 3)// map[]fmt.Println(sliceMap)k := "中国"value, ok := sliceMap[k]if !ok {value = make([]string, 0, 2)}value = append(value, "北京", "上海")sliceMap[k] = value// map[中国:[北京 上海]]fmt.Println(sliceMap)
}
package mainimport "fmt"func main() {// 构建一个 map, 容量为 3,元素类型为 []string 切片var sliceMap = make(map[string][]int, 3)sliceMap["北京"] = []int{1, 2, 3, 4, 5}// map[北京:[1 2 3 4 5]]fmt.Println(sliceMap)
}

9.5 作业

9.5.1 判断字符串中汉字的数量

思路:

  • 依次获取每个字符
  • 判断字符是不是汉字
  • 把汉字出现的次数累加
package mainimport ("fmt""unicode"
)func main() {s1 := "我是 CnPeng,我在济南"var count intfor _, c := range s1 {// 判断是不是汉字if unicode.Is(unicode.Han, c) {count++}}fmt.Println(count)
}

9.5.2 统计单词出现的次数:

package mainimport ("fmt""strings"
)func main() {s1 := "how do you do "strSlice := strings.Split(s1, " ")strMap := make(map[string]int, 10)for _, w := range strSlice {if _, ok := strMap[w]; !ok {strMap[w] = 1} else {strMap[w]++}}for k, v := range strMap {fmt.Println(k, v)}
}

9.5.2 回文判断

一个字符串从左向右读和从右向左读含义一致,就称为回文。如:

“上海自来水来自海上”、“山西运煤车煤运西山”、“黄山落叶松叶落山黄”

package mainimport "fmt"func main() {s1 := "山西运煤车煤运西山"// 规律:s1[0]==s[len(ss)-1]// 		s1[1]==s[len(ss)-1-1]// 		s1[2]==s[len(ss)-1-2]// 		s1[3]==s[len(ss)-1-3]// 。。。s1[i]==s[len(ss)-1-i]// 将字符串转换成 rune 切片r := make([]rune, 0, len(s1))for _, c := range s1 {r = append(r, c)}// 只比较前面一半和后面一个就可以for i := 0; i < len(r)/2; i++ {if r[i] != r[len(r)-1-i] {fmt.Println("不是回文")return}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql on条件判断是要注意null值

我是因为用了merge into语法&#xff0c;然后on条件中判断的字段是可配置的&#xff0c;这就导致了&#xff0c;有时候判断条件多的情况下&#xff0c;判断的字段会碰到有null值的情况&#xff0c;如果on两边的字段都是null&#xff0c;null和null对比就会导致结果为false&…

安全防御第二次作业

1. 防火墙支持那些NAT技术&#xff0c;主要应用场景是什么&#xff1f; 防火墙支持几乎所有的NAT技术&#xff0c;包括源NAT、目标NAT、双向NAT等&#xff0c;主要应用场景是保护内部网络免受外部网络的攻击 NAT技术可以将IP数据报文头中的IP地址转换为另一个IP地址&#xff…

stc8H驱动并控制三相无刷电机综合项目技术资料综合篇

stc8H驱动并控制三相无刷电机综合项目技术资料综合篇 🌿相关项目介绍《基于stc8H驱动三相无刷电机开源项目技术专题概要》 🔨停机状态,才能进入设置状态,可以设置调速模式,以及转动方向。 ✨所有的功能基本已经完成调试,目前所想到的功能基本已经都添加和实现。引脚利…

C++入门知识

Hello&#xff0c;今天我们分享一些关于C入门的知识&#xff0c;看完至少让你为后面的类和对象有一定的基础&#xff0c;所以在讲类和对象的时候&#xff0c;我们需要来了解一些关于C入门的知识。 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对…

【Python从入门到进阶】37、selenium关于phantomjs的基本使用

接上篇《36、Selenium 动作交互》 上一篇我们介绍了selenium操作网页的动作内容。本篇我们来学习有关phantomjs的相关知识。 一、selenium的缺点 在介绍PhantomJS之前&#xff0c;让我们先讨论一下直接使用Selenium的一些缺点。 1、显示浏览器窗口&#xff1a;Selenium通常需…

AndroidUtil - 强大易用的安卓工具类库

官网 https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md 项目介绍 AndroidUtilCode &#x1f525; 是一个强大易用的安卓工具类库&#xff0c;它合理地封装了安卓开发中常用的函数&#xff0c;具有完善的 Demo 和单元测试&#xff0c;利用其封装好的 API…

CUDA学习笔记0924

一、nvprof分析线程束和内存读写 &#xff08;1&#xff09;线程束占用率分析 线程束占用率&#xff1a;nvprof --metrics achieved_occupancy &#xff08;2&#xff09;内存读写分析 内核数据读取效率&#xff1a;nvprof --metrics gld_throughput 程序对设备内存带宽利…

《动手学深度学习 Pytorch版》 7.4 含并行连接的网络(GoogLeNet)

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l7.4.1 Inception块 GoogLNet 中的基本卷积块叫做 Inception 块&#xff08;大概率得名于盗梦空间&#xff09;&#xff0c;由 4 条并行路径组成。 前 3 条路径使用窗口…

合规性管理如何帮助产品团队按时交付?

成功的产品和产品发布背后通常需要经过一个涉及多个监督机构、多功能团队和利益相关者的复杂流程。在组织的治理、风险管理和合规性&#xff08;GRC&#xff09;框架下&#xff0c;产品团队不仅需要追求市场创新&#xff0c;还需要确保符合所有适用的法规、标准和合同要求。由于…

libpcap之socket创建

一、 lipcap回调注册 在libpcap中&#xff0c;最重要的就是打开接口&#xff0c;其中关键函数为pcap_activate。这里只关注Linux平台。 只分析通用平台。 pcap_t * pcap_create(const char *device, char *errbuf) { ... p pcap_create_interface(device_str, errbuf); ... …

【性能测试】JMeter:集合点,同步定时器的应用实例!

一、集合点的定义 在性能测试过程中&#xff0c;为了真实模拟多个用户同时进行操作以度量服务器的处理能力&#xff0c;可以考虑同步虚拟用户以便恰好在同一时刻执行操作或发送请求。 通过插入集合点可以较真实模拟多个用户并发操作。 (注意&#xff1a;虽然通过加入集合点可…

Go内置函数make和new的区别?

首先纠正一下make 和 new 是内置函数&#xff0c;不是关键字。 变量初始化&#xff0c;一般分为2步&#xff0c;变量声明变量内存分配&#xff0c;var 关键字就是用来声明变量的&#xff0c;new和make 函数主要是用来分配内存的。 var 声明值类型的变量时&#xff0c;系统会默…

利用Socks5代理IP加强跨界电商爬虫的网络安全

随着跨界电商的兴起&#xff0c;爬虫技术在这个领域变得越来越重要。然而&#xff0c;网络安全一直是一个值得关注的问题。在本文中&#xff0c;我们将讨论如何利用代理IP和Socks5代理来增强跨界电商爬虫的网络安全&#xff0c;确保稳定和可靠的数据采集&#xff0c;同时避免封…

Leetcode13. 罗马数字转整数

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 5…

Vector Art - 矢量艺术

什么是矢量艺术&#xff1f; 矢量图形允许创意人员构建高质量的艺术作品&#xff0c;具有干净的线条和形状&#xff0c;可以缩放到任何大小。探索这种文件格式如何为各种规模的项目提供创造性的机会。 什么是矢量艺术作品? 矢量艺术是由矢量图形组成的艺术。这些图形是基于…

后端面试关键问题大总结

一、Java基础 1.HashMap的底层原理 2.说一下List的特点 3.介绍一下Java的基本数据类型 &#xff08;问到这个问题说明你触碰到面试官的技术能力水平底线了&#xff09; 二、线程 1.说一下线程的4种创建方式 2.线程池的两种创建方式&#xff0c;包括jdk方式和spring方式 …

怒刷LeetCode的第3天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;模拟 方法二&#xff1a;数学规律 方法三&#xff1a;分组 第三题 题目来源 题目内容 解决方法 方法一&#xff1a;数学方法 方法…

QT:使用行编辑器、文本编辑器、单选按钮、水平布局、垂直布局做一个小项目

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> //行编辑器 #include <QTextEdit> //文本编辑器 #include <QRadioButton> //单选按钮class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *pare…

USB总线-Linux内核USB3.0主机控制器驱动框架分析(十二)

1.概述 如下图所示&#xff0c;Linux内核中USB主机体系结构由五部分组成&#xff0c;分别为Application Software、USB Class Driver、USB Core(USB Driver)、USB Host Controller Driver、USB Host Controller。应用程序处于用户空间&#xff0c;通过系统调用访问Class Drive…

关于计算机找不到d3dx9_43.dll,无法继续执行代码修复方法

d3dx9_43.dll是一个动态链接库文件&#xff0c;它是DirectX的一个组件&#xff0c;主要用于处理游戏中的图形、声音等多媒体元素。当这个文件丢失时&#xff0c;可能会导致以下问题&#xff1a; 1. 游戏无法正常运行&#xff1a;由于d3dx9_43.dll负责处理游戏中的多媒体元素&a…