跟着老猫来搞GO-内建容器Map
前期回顾
在上面的文章中,老猫和大家分享了GO语言中比较重要的两种数据结构,一种是数组,另外一种是基于数组的slice。本篇文章想要继续和大家分享剩下的容器以及字符字符串的处理。
MAP
map的定义
在Java语言中其实还有一个键值对的容器,叫做Map,当然在我们GO语言中也有这种数据结构,例如,下面咱们就来看一下GO语言中Map的写法以及用法。看下一Map的语法定义,如下例子:
m :=map[string]string {
"name":"ktdaddy",
"age":"28",
"job":"softEngineer",
}
关于语法的定义其实也是比较简单的,方括号里面的表示key值,后面的那个类型表示value的类型。上面老猫其实定义了一个map,并且给它初始化了一些数据。定义一个空的map其实也是比较简单的,主要有下面两种方式
m1 :=make(map[string]int) //采用make函数直接创建一个map,比较常用
var m2 map[string] int //用var函数申明的方式创建map
说实在的语法这种东西也没法说出什么所以然来,大家既然想要学习这个语言就要去记下它的规则,所以还是得多写多练,长时间不去用可能就忘记了。
总结一下其定义形式map[k]V,当然咱们也可以定义它比较复杂一些的数据结构,例如map里面套map,这种复合型的,那么定义的最终形式就是map[K1]map[K2]V。
对map的操作
查询元素
我们定义出一个map之后,正常的逻辑就要去操作这个map,咱们先来看一下如何遍历一个map,我想大家比较容易想到的就是我们讲array的时候用的range函数的方式。确实,咱们可以写成这样,咱们就以一开始定义的m这个Map为例吧
for k,v :=range m {
fmt.Println(k,v)
}
这样我们就可以获取所有的数据,当然我们也可以根据对应的Key值获取相关的value
name :=m["name"]
但是很多时候,我们是不能知道这个key是否存在的,我们取值的时候就要先判断当前的key是否存在,然后再去获取值,其实我们可以这样写
name,ok :=m["name"]
fmt.Println(name,ok) //结果输出ktdaddy true
很显然,我们可以通过ok的值去判断当前的key是否存在,然后再去获取其中的value值。那么结合前面所讲的if条件语句,咱们就可以写出这样的逻辑
if name,ok :=m["name"];ok {
fmt.Println(name)
}else {
fmt.Println("key does not exist")
}
删除元素
删除元素其实是相当简单的,用内置函数delete函数即可。我们还是承接上面的逻辑,如果发现存在这个Key值,那么我们就从map中进行移除。具体如下
if name,ok :=m["name"];ok {
delete(m,"name")
name,ok = m["name"]
fmt.Println(name,ok)
}else {
fmt.Println("key does not exist")
}
上述删除之后咱们重新赋值map,这样这个代码最终输出的结果就是false。大家可以实际动手练习一下。
字符串的处理
老猫想过好几次,如何写这个字符串,想要将其单独抽出来说感觉也不合适,因为咱们很多时候会遍历容器中的字符,因此索性就将其合并在内建容器里面一起分享好了。这里主要想和大家分享的是rune这个内建类型,从前面的章节中我们都知道这个相当于是Go的char,那么这个又怎么来用呢?咱们先来看下面例子
s:= "hello我爱GO开发"
fmt.Println(len(s))
大家觉得这个应该会输出多少呢?试着运行一下,答案是19,那么为什么呢?我们再接着转换成字节输出一下
s:= "hello我爱GO开发"
fmt.Println(s)
fmt.Println(len(s))
fmt.Printf("%X\n",[]byte(s))
这样呢,我们就获取一段16进制的字节,结果如下
68656C6C6FE68891E788B1474FE5BC80E58F91
很显然,我们还是无法看出来,我们将其格式做一下分割调整来看一下
s:= "hello我爱GO开发"
fmt.Println(s)
fmt.Println(len(s))
fmt.Printf("%X\n",[]byte(s))
for _,b:=range []byte(s) {
fmt.Printf("%X ",b)
}
运行的结果为 :68 65 6C 6C 6F E6 88 91 E7 88 B1 47 4F E5 BC 80 E5 8F 91
数一下成对出现的16进制数,咱们就可以发现19个字节长度原来是这么来的。通过分析我们不难发现一个英文占用了两个字节而中文则占用了3个字节,例如里面的“我”转换之后就是:E6 88 91,那么我们直接输出s又会是什么呢?
for i,ch := range s{ // ch is a rune
fmt.Printf("(%d %X) ",i,ch)
}
fmt.Println()
结果为:
(0 68) (1 65) (2 6C) (3 6C) (4 6F) (5 6211) (8 7231) (11 47) (12 4F) (13 5F00) (16 53D1)
其实通过68 65 6C 6C 6F E6 88 91 E7 88 B1 47 4F E5 BC 80 E5 8F 91 转换成了上面这个是通过什么转换的呢?其实通过utf-8转换成了unicode编码,我们发现转换成unicode之后,相关的中文字符编程了长度为4的16进制数,那么其实就是相当于是rune所占的字节长度了。
所以我们直接用rune对其进行转换。
for i,ch :=range []rune(s){
fmt.Printf("(%d %c)",i,ch)
}
这样我们就得到了如下
(0 h)(1 e)(2 l)(3 l)(4 o)(5 我)(6 爱)(7 G)(8 O)(9 开)(10 发)
如此,其实就遍历获取到了每个字符了。
当然,如果我们要统计utf-8下的字符长度,其实我们要对其进行转换,在此介绍两个函数
utf8.RuneCountInString(s)
utf8.DecodeRune(bytes)
通过这两个函数,咱们可以获取中文字符下的具体的字符个数了。
看起来比较零碎,咱们做一下总结,当然剩下还是得大家自己写一下。
- 使用range遍历pos,rune对
- 使用utf8.RuneCountInString(s)获取字符数量
- 使用len获取字节长度
- 使用[]byte获取字节
总结
本次主要和大家分享了内建容器的剩余部分map的定义以及相关的操作使用,后面还和大家穿插了部分字符串的处理方式,当然还是比较散的,后面在写项目的过程中,咱们到时候在具体用起来,所以在此希望大家持续关注老猫,另外的也希望大家多练习,一起进步,加油。
我是老猫,更多内容,欢迎大家搜索关注老猫的公众号“程序员老猫”。

跟着老猫来搞GO-内建容器Map的更多相关文章
- 跟着老猫来搞GO-容器(1)
前期回顾 前面的一章主要和大家分享了GO语言的函数的定义,以及GO语言中的指针的简单用法,那么本章,老猫就和大家一起来学习一下GO语言中的容器. 数组 数组的定义 说到容器,大家有编程经验的肯定第一个 ...
- 跟着老猫来搞GO,集跬步而致千里
上次博客中,老猫已经和大家同步了如何搭建相关的GO语言的开发环境,相信在车上的小伙伴应该都已经搞定了环境了.那么本篇开始,我们就来熟悉GO语言的基础语法.本篇搞定之后,其实期待大家可以和老猫一样,能够 ...
- 跟着老猫来搞GO,基础进阶
回顾一下上一篇博客,主要是和大家分享了GO语言的基础语法,其中包含变量定义,基本类型,条件语句,循环语句.那本篇呢就开始和大家同步一下GO语言基础的进阶. 函数的定义 上次其实在很多的DEMO中已经写 ...
- 跟着老猫来搞GO,"面向对象"
前言 之前和大家分享了容器以及相关的基础语法,以及函数,相信如果大家有接触过C++或者java的朋友都晓得面向对象,其实在GO语言中也存在面向对象,但是还是比较简单的,下面我们来看一下GO语言的&qu ...
- go内建容器-Map
1.基础定义 golang中的map如同它的函数一样"纯粹",map就是用来存储键值对的容器,别管什么哈希不哈希的(底层已实现),用就行 //创建一个map m := map[st ...
- 跟着老猫一起来学GO,环境搭建
老猫的GO学习系列博客已经正式发车了,相信大家以前学习一门编程语言的时候也有经验,咱们一般都是从环境开始,在此呢,大家也跟着老猫从最开始的搭建环境开始. GO语言的安装 首先呢,我们开始需要下载GO语 ...
- Python的程序结构[2] -> 类/Class[6] -> 内建类 map
内建类map / Built-in Type map 关于内建类 map 是一个内建的类,能够返回一个 map 的 obj.map 的第一个参数为一个可执行函数,后续参数均为可迭代对象,map 会分别 ...
- go内建容器-切片
1.基础定义 看到'切片'二字,满脸懵逼.切的啥?用的什么刀法切?得到的切片有什么特点?可以对切片进行什么操作? 先看怎么得到切片,也就是前两个问题.切片的底层是数组,所以切片切的是数组:切的时候采用 ...
- go内建容器-字符和字符串操作
1.基础定义 在基础语法篇提到过golang的rune相当于其他编程语言的char,其本质是一个int32(四字节),用[]rune来转换一个字符串时,得到的是个解码后的结果,存储在新开辟的[]run ...
随机推荐
- 《手把手教你》系列技巧篇(三十二)-java+ selenium自动化测试-select 下拉框(详解教程)
1.简介 在实际自动化测试过程中,我们也避免不了会遇到下拉选择的测试,因此宏哥在这里直接分享和介绍一下,希望小伙伴或者童鞋们在以后工作中遇到可以有所帮助. 2.select 下拉框 2.1Select ...
- 2021能源PWN wp
babyshellcode 这题考无write泄露,write被沙盒禁用时,可以考虑延时盲注的方式获得flag,此exp可作为此类型题目模版,只需要修改部分参数即可,详细见注释 from pwn im ...
- Zookeeper+Dubbo环境搭建与Demo测试
环境准备: 1. zookeeper-3.4.14 (下载地址:http://archive.apache.org/dist/zookeeper/) 2. dubbo-0.2.0 (下载地址 ...
- 【c++ Prime 学习笔记】第8章 IO库
C++语言不直接处理输入输出,而是通过标准库中的一组类来处理IO 1.2节介绍的IO库: istream(输入流)类型,提供输入 ostream(输出流)类型,提供输出 cin,是istream对象, ...
- 短短 29 天,应对高峰 100W+ 访问,看浙大如何交出满分答卷
疫情期间"停课不停教,停课不停学",线上开课第一天,浙江大学网上开课平台访问量即突破100 万次,访客数3万余人,最高峰达 1.1万人同时在线,发起课程直播2000余场,然而系统却 ...
- VMD可视化hdf5格式的分子坐标文件
技术背景 VMD是分子动力学模拟领域常用的一款可视化软件,可以非常直观方便的展示分子的运动过程.而VMD本身对展现的格式有一定的要求,如果不是常见的rst等类型的坐标文件的话,就需要自己手动去实现一个 ...
- BUAA_2020_软件工程_结对项目作业
项目 内容 这个作业属于哪个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 掌握软件工程的思路方法 这个作业在哪个具体方面帮助我实现目标 学习结对编程 教学班级 006 项目地址 ...
- [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)
前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...
- .NET 5 全自动分表组件,.NET 分表方案 ,分表架构与设计
一.疑问&目的 1.1 分表使用场景 (1)可扩展架构设计,比如一个ERP用5年不卡,到了10就卡了因为数据太多了,这个时候很多人都是备份然后清空数据,这个工作大并且麻烦,以前的数据很难在使用 ...
- cf 24 Game (观察+.. 想一想)
题意: 给一个数N,从1到N. 每次取两个数,三种操作:加.减.乘,运算完得一个数,把那俩数删了,把这个数加进去. 重复操作N-1次. 问是否可能得到24.若可以,输出每一步操作. 思路: 小于4,不 ...