回顾上一篇文章,老猫和大家分享了GO语言中重要的两种数据结构。 一个是数组,另一个是基于数组的slice。 在这篇文章中,我想继续和大家分享剩下的容器和字符串的处理。
在MAP Map的定义中,Java语言包含一个称为Map的键值对容器。 当然,我们的GO语言也有这样的数据结构。 例如,让我们看看map在GO语言中的写法和用法。 让我们来看看下面Map的语法定义。 以下示例。
m :=map [ string ] string { ‘ name ‘ : ‘ kt daddy ‘、’ age’:’28 ‘、’ job’:’softEngineer ‘,}关于语法的定义定义空map其实也比较简单,主要有以下两种方法
m 1:=使用make (map [ string ] int ) make函数直接创建map,用var m2 map[string] int //) var函数声明的方式创建map,真正的语法是无从谈起的
其定义格式总结map[k]V当然也可以定义更复杂的数据结构,例如在map中合并map的复杂类型。 定义的最终形式为映射[ k1 ]映射[ k2 ] v。
为map操作查询元素定义map后,常规逻辑将使用此map。 我们先来看看如何遍历地图。 我认为大家容易想到的是说array时使用的range函数的方式。 确实,我们可以这样写。 以最初定义的名为m的Map为例
for k,v:=rangem{fmt.println(k,v ) }允许获取所有数据。 当然,也可以从相应的Key值中获取相关的value
name :=m[‘name’]但是,我们往往不知道这个密钥是否存在。 我们取值的时候,需要判断当前的key是否存在后再取值。 实际上,你可以这样写
name,ok :=m [ ‘ name ‘ ] fmt.println (name,ok ) /结果输出ktdaddy true显然可以根据ok值判断当前密钥是否存在,并获取其中的值与前面提到的if条件语句相结合,可以写出这样的逻辑
if name,ok :=m[‘name’]; 删除ok{fmt.println(name ) }else ) fmt.println ) ) keydoesnotexist )元素其实相当简单,只要使用内置函数的delete函数就可以了。 我们还是接受上面的逻辑,如果发现这个Key值存在,我们就从map中删除。 具体如下
if name,ok :=m[‘name’]; ok{delete(m,’ name ‘ ) name,ok=m[‘name’]fmt.println ) name,ok ) false ) fmt.println ) keydoesnotexist女士们
处理字符串的老猫考虑过很多次,但是如何写这个字符串并不适合单独提取。 我们经常遍历容器里的文字,干脆就集中在内置容器里共享吧。 在这里,我主要想分享的是一个名为rune的内置类型,从上一章我们就知道我们相当于这个Go的char。 那么,这个怎么用? 我们先来看看下面的例子
s:=’hello我很喜欢GO开发’ fmt.println(Len(s ) )你觉得这个会输出多少? 试试执行,答案是19。 那为什么呢? 接下来转换成字节输出吧
s:=’hello我是GO开发’ fmt.Println(s(s ) fmt.println (len ) s ) ) fmt.printf ) ‘ %x\n ‘,[]byte(s ) s
6656 c6c6Fe 68891 e 788 b 1474 Fe 5b c 80e 58 f 91看起来不明显,请尝试拆分和调整格式
s:=’hello我是GO开发’ fmt.Println(s(s ) fmt.println (len ) s ) ) fmt.printf(%x(n ),[]byte(s ) s ) )
如果你计算一下成对出现的十六进制数,就会发现原来19字节的长度是这样来的。 分析表明,一个英语占2字节,中文占3字节。 例如,里面的“我”被转换后,变成:E6 88 91。 那么,直接输出s会怎么样呢?
for i,ch :=ranges {//chisarunefmt.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的定义以及相关的操作使用,后面还和大家穿插了部分字符串的处理方式,当然还是比较散的,后面在写项目的过程中,咱们到时候在具体用起来,所以在此希望大家持续关注老猫,另外的也希望大家多练习,一起进步,加油。
我是老猫,更多内容,欢迎大家搜索关注老猫的公众号“程序员老猫”。