Go通关04,集合类型

Array(数组)

数组存放的是固定长度、相同类型的数据。

数组声明

  1. var <数组名> = [<长度>]<元素>{元素1,元素2}
    var arr = [2]int{1,2}
    或者
    arr := [2]int{1,2}

  2. var <数组名> = [...]<元素类型>{元素1,元素2}
    var arr = [...]int{1,2}
    或者
    arr := [...]int{1,2}

  3. var <数组名> = [...]<类型>{索引1:元素1,索引2:元素2}
    var arr = [...]int{1:1,0:2}
    或者
    arr := [...]int{1:1,0:2}

数组的每个元素在内存中都是连续存放的,每个元素都有一个下标,下标从0开始。
数组长度可以省略,会自动根据{}中的元素来进行推导。
没有初始化的索引,默认值是数组类型的零值。

数组循环

for i,v := range array {
  fmt.Printf("索引:%d,值:%s\n",i,v)
}
  1. range 表达式返回数组索引赋值给 i,返回数组值赋值给 v。
  2. 如果返回的值用不到,可以用 _ 下划线丢弃:
for _,v:= range array{
  fmt.Printf("值:%s\n",i,v)
}

切片

切片和数组类型,可以理解为动态的数组,切片是基于数组实现的,它的底层就是一个数组。对于数组的分割,便可以得到一个切片。

数组生成切片

slice := array[start:end]

array := [5]string{"a","b","c","d","e"}
slice := array[2:5]
fmt.Println(slice) //[c d e]

注意:这里包含索引2,但是不包含索引5的元素,即:左闭右开。
经过切片后,切片的索引范围也改变了。
array[start:end] 中的 start 和 end 都是可以省略的,start 的默认值是 0 ,end 的默认值为数组的长度。

array[:] 等价于 array[0:5]

切片修改

切片的值也可以被修改,这里也可以证明切片的底层是数组。

array := [5]string{"a","b","c","d","e"}
slice := array[2:5] //[c d e]
slice[1] = "f"
fmt.Println(slice) //[c f e]
fmt.Println(array) //[a b c f e]

修改切片,对应的数组值也被修改了,所以证明基于数组的切片,使用的底层数组还是原来的数组,一旦修改切片的元素值,底层数组对应的值也会被修改。

切片声明

使用 make 函数声明切片

//声明一个元素类型为string的切片,长度是4
slice := make([]string,4)
//长度是4,容量是8
slice1 := make([]srting,4,8)

切片的容量不能比切片长度小。
长度就是元素个数。
容量就是切片的空间。

上面实例在内存上划分了一个容量为8的内存空间,但是只是用了4个内存空间,剩余的处于空闲状态。当通过 append 往切片追加元素时,会追加到空闲内存上,剩余空间不足时,会进行扩容。

字面量初始化切片

slice2 := []string{"a","b","c"}
fmt.Println(len(slice2),cap(slice2)) //3 3

Append

append 函数对一个切片进行追加元素:

slice3 := append(slice2,"d")
//追加多个元素
slice3 := append(slice2,"d","f")
//追加一个切片
slice3 := append(slice2,slice...)

小技巧:
在创建新切片时,最好让长度和容量一样,这样追加操作的时候就会生成新的底层数组,从而和原有数组分离,就不会因为公用底层数组导致修改内容的时候影响多个切片。

切片循环

切片循环与数组一样,也是使用 for range 方式。

Map (映射)

map 是一个无序的 k-v 键值对集合。其中 k 必须是相同类型。k 和 v 的类型可以不同。 k 的类型必须支持 == 比较运算符,这样才可以判断它是否存在,并保证唯一

Map 声明初始化

  1. make:
    mapName := make(map[string]int)

  2. 字面量:
    mapName := map[string]int{"无尘":29}

如果不想创建的时候添加键值对,使用空大括号{}即可,切记不能省略。

Map 获取、删除

//添加键值对或更新对应的key的value
mapName["无尘"] = 20
//获取指定key的value
age := mapName["无尘"]

获取不存在的 k-v 键值对时,如果 key 不存在,返回的 value 是该值的零值,所以很多时候,需要先判断 map 中的 key 是否存在。

nameAge := make([string]int)
nameAge["无尘"]=29
age,ok := nameAge["无尘"]
if ok {
  fmt.Println(age)
}
  • map 的 [] 操作返回两个值
    • 第一个是 value
    • 第二个是标记该 key 是否存在,存在则为 true

delete()函数进行删除

delete(nameAge,"无尘")

  • delete 有两个参数,一个是map,一个是要删除的 key 。

遍历 Map

nameAge["无尘"] = 29
nameAge["无尘1"] = 30
nameAge["无尘2"] = 31

for k,v := range nameAge{
  fmt.Println("key is",k,"value is ",v)
}
  • 对应 map ,for range 返回两个参数,分别是 k 和 v。

小技巧:for range 遍历 map 的时候,若使用一个返回值,则这个返回值是 map 的 key 。

Map 的大小

map 不同于切片,map 只有长度,没有容量。可以使用 len 函数获取 map 大小。

String 和 []byte

字符串也是一个不可变的字节序列,可以直接转为字节切片 []byte :

s:="Hello无尘小生"
bs := []byte(s)

string 不止可以直接转为 []byte,还可以使用 [] 操作符获取指定索引的字节值。

字符串是字节序列,每一个索引对应一个字节,在 UTF8 编码下,一个汉字对应三个字节。
如果把一个汉字当做一个长度计算,可以使用 utf8.RuneCountInString 函数。
for range 遍历时,是按照 unicode 字符进行循环的,一个汉字占一个长度。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容