第三章总结 go内建容器

第三章.内建容器

一.数组

1.Range:
1).Range 意义明确,美观
2).c++ 没有类似能力
3).java/python 只能for each value 不能同时获取i,v

2.数组是值类型
1).[10]int和[20]int是不同类型
2).调用func f(arr [10]int)会 拷贝 数组
3).在go语言中一般不直接使用数组

二.切片(Slice)

1).切片
arr := […]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6]
s2 := s1[3:5]

1.s1的值为[2 3 4 5],s2的值为[5 6]
2.slice 可以向后扩展,不可以向前扩展
3.s[I]不可以超越len(s),向后扩展不可以超越底层数组cap(s)

2).向Slice添加元素
1.添加元素时如果超越cap,系统会重新分配更大的底层数组
2.由于值传递的关系,必须接收append的返回值
3.s = append(s,val)

三.map

1).map 的操作
1.创建:make(map[string]int)
2.获取元素:m[key]
3.Key 不存在时,获得 Value 类型的初始值
4.用 value, ok := m[key]来判断是否存在 key
5.用 delet 函数,删除 key

2).map 的遍历
1.使用 range 遍历 key,或者遍历 key,value 对
2.不保证遍历顺序,如需顺序,需手动对 key 排序
3.使用 len 获取元素的个数

3).map 的key
1.map 使用哈希表,必须可以比较相等
2.除了 slice, map, function 的内建类型都可以作为 key
3.struct 类型不包含上述字段,也可作为 key

例题:寻找最长不含有重复字符的子串
abcabcbb -> abc
bbbbb ->b
pwwkew -> wke

四.字符和字符串处理

1).rune 相当于 go 的 char
1.使用 range 遍历 pos, rune 对
2.使用 utf-8.RuneCountInString 获得字符数量
3.使用 len 获得字节长度
4.使用 []byte 获得字节长度

2).其他字符串操作
1.fields, Split, Join
2.Contains, Index
3.ToLower, ToUpper
4.Trim, TrimRight, TrimLeft