乐呵乐呵得了
开场就有料,今天返回去看了看以前的文章,轻松指数有点下降趋势。一琢磨,这不是我的风格呀。一反思,合着是这段时间,脑子里杂七杂八的杂事有点多,事情一多,就忘了快乐。古话说得好:愁也一天,乐也一天,只要还能过得去,完事不钻牛角尖。这话真应该变成座右铭,最次成口头禅也成。还有句古话是这么说:哭也一天,笑也一天,只要不做亏心事,就是活神仙。两句正好凑合对联,过年贴上,保准比那些个风调雨顺,国泰民安之类的对子好,还实用,您说是不是。
烦自心中来,乐自脑中生。万事都有其两面性,看你怎么想。越想越好,可能坏事能变好。越想越坏,事还没变坏,自己个先把自己个吓死了。所以古人才创造了个塞翁失马焉知非福的寓言小故事,鲁迅先生也抽象出了阿Q这么个丰满的人物。事无定论,运无长势,谁知道下一秒会变成什么样呢。所以嘛,乐呵乐呵得了。别老挣着面粉的钱,操着白粉的心了。
上节聊了聊切片的基本使用规则。 讲真话,单靠我那一点点文字,没法把切片讲的透透彻彻,明明白白。如果真要讲到那个份,估计没等看完,你就该睡着了。入门嘛,够用就行。等入完门,真要用到那么高深规则的时候,自己再去查都来得及。所以甭喷讲的浅,讲深才不是我的风格呢。
这节,我们来接着切片(数组)的感觉往下聊如何遍历迭代。我刚接触Golang的时候,经常需要迭代数组里面的元素,最简单的方式是写个下标,然后不停的循环累加,取下标的值。这是到哪都通用的方式,但如果遇到map了呢?就不适用了。所以Golang内置了range操作来迭代集合数据结构。
先看看如何迭代数组或者切片:
numbers := []int{0,1,2,3,4,5,6,7,8}
for i:= range numbers {
fmt.Println("Slice item",i,"is",numbers[i])
}
range后面紧跟切片变量,而且前面肯定是for。此时i就是数组下标,循环一次,i会自增加一,直到numbers循环完毕。上面刚说除了可以迭代切片,还可以除了map。因为map存在key和value,所以range就有两种写法:
countryCapitalMap := map[string] string {"France":"Paris","Italy":"Rome","Japan":"Tokyo"}
for country := range countryCapitalMap {
fmt.Println("Capital of",country,"is",countryCapitalMap[country])
}
for country,capital := range countryCapitalMap {
fmt.Println("Capital of",country,"is",capital)
}
此时,range可以依次取出key,也可以同时取出key和value。此时需要注意,key的不是由ragne来保证,而是由map来决定的。range操作只不过是挨个依次取出数据集合中的元素而已。
本来range操作是需要放到上节中说的,但临近中午都要吃饭嘛,所以犯懒没写。这节补上,反正range操作仅此而已。但既然提到了map,那就开聊map吧。平时我也是这样,随便来个话头都能继续聊下去,几个朋友瞎扯淡,不就是没事找事,没话找话嘛。事先打草稿,一准是事先预谋好的(这里就要由衷的表扬一下各个公司的CXO,随便一人洋洋洒洒就能脱口秀好几个小时,要想融到资,必须打小就要学会有条理的瞎扯淡)。所以想哪就写哪,下面聊map。
Map基本是各种编程语言中必备的一种数据类型,所以Golang也不能拉下这种重要的东西。Golang不比Java,map是接口,还实现了hashmap,linkedhashmap 还有treemap. Golang当中没有那么多的实现,只有hashmap。非要在说一个map,那就是bitmaps(应该是没有其它map了,查看官方文档和查看golang源码也没有找到其它map。如果你发现还有其它类型的map,请告诉我,应该是没了)。
bitmap和hashmap都不是一路人,所以不提也罢。因此下面的map指的就是hashmap。先说怎么创建一个map,这里要用到make函数了,在创造切片的时候用过它,在golang当中创建各种数据类型,基本都会用到它。
map_variable := make(map[key_data_type]value_data_type)
比如,我们创造一个map,key是string,value是int。就是;
myMap := make(map[string]int)
不需要指定大小,因为map会自动扩容。这样就可以下面就可以使用myMap了。 如果喜欢文绉绉的风格,还可以这么做:
var myMap map[string]int
myMap = make(map[string]int)
效果一个样,但代码行数变两行(V2EX还有人讽刺说,如果我的文章按行算就发财了。 对不起,一来不收费。二来哪家公司按行算?典型的说话不过大脑,讽刺找不到穴位)。 还是那句话,选择哪个都行,高兴就好。
结合上面的range操作,把map也糅合进去:
package main
import "fmt"
func main() {
var countryCapitalMap map[string]string
countryCapitalMap = make(map[string]string)
countryCapitalMap["France"] = "Paris"
countryCapitalMap["Italy"] = "Rome"
countryCapitalMap["Japan"] = "Tokyo"
countryCapitalMap["India"] = "New Delhi"
for country := range countryCapitalMap {
fmt.Println("Capital of",country,"is",countryCapitalMap[country])
}
}
在日常使用过程当中,有两个操作经常出现,一判断指定Key是否存在。二删除指定Key。
先来回答第一个问题,如果判断指定Key是否存在:
capital, ok := countryCapitalMap["United States"]
if(ok){
fmt.Println("Capital of United States is", capital)
} else {
fmt.Println("Capital of United States is not present")
}
ok是个bool值,用来表示指定的Key是否存在,简单明了。然后回答第二个问题,如何删除?
delete(countryCapitalMap,"France")
恩,就用delete函数,简单粗暴。对于Golang来说,个人感觉应该是入门难度相对很低的一门语言了,除了语法稍微要适应一下,基本没有太大的学习成本。以前的知识和储备都不需要扔掉,换个壳子就能用。
今天周五(12.1)了,也不知道你能看下去多少,反正我是写不了多少了。 所以俩手指绕绕脑袋,休息一下,休息一小下儿吧。