GO语言学习入门笔记系列详解(五):Go语言的内建容器
数组
数组的定义和遍历
- 二位数组数量要写在类型的前面
var arr1 [5]int
arr2 := [3]int{1, 3, 5}
//让编译器帮我们数有几个int
arr3 := [...]int{2, 4, 6, 8, 10}
//二维数组
var grid [4][3]int
fmt.Println(arr1, arr2, arr3, grid)
- 遍历数组
//遍历数组获得元素下表和元素值
for i := range arr3 {
fmt.Println(arr3[i])
}
//遍历数组获得元素下表和元素值
for i ,v:= range arr3 {
fmt.Println(i,v)
}
数组类型
- 数组是值类型
- [10] int 和[20] int是不同的类型
- 调用func f(arr [10]int)会拷贝数组
- 在go语言中一般不直接使用数组
切片
- 几种切片方式
arr := [...]int{0,1,2,3,4,5,6,7}
fmt.Println("arr[2:6] = ",arr[2:6])
fmt.Println("arr[:6] = ",arr[:6])
fmt.Println("arr[2:] = ",arr[2:])
fmt.Println("arr[:] = ",arr[:])
- Slice本身没有数据,是对底层array的一个view
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s := arr[2:6]
s[0] = 10
-
arr的值变为[0,1,10,3,4,5,6,7]
-
Reslice
s := arr[2:6]
s = s[:3]
s = s[1:3]
s = arr[:]
Slice的拓展
arr := [...]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6]
s2 := s1[3:5]
-
s1的值是多少?2,3,4,5,6
但是还是会继续打印下标直到结束
-
s2的值是多少?5,6
s2中还可以取出下标对应的数值。
-
slice可以向后拓展,但是不能向前拓展
-
s[i]不可以len(s),向后扩展不可以超越底层数组caps(s)
其他拓展
- 向slice添加元素时,如果超越了cap,系统会重新分配更大的底层数组。
- 由于值传递的关系,必须接收append的返回值
- s = append(s,val)
- 复制操作
copy(s2,s1)
- 删除操作
s2 = append(s2[:3],s2[4:]...)
其他方式定义slice
//第一种
var s[]int
//第二种
s1 := [] int{2,4,6,8}
//第三种
s2 := make([] int.10,32)
Map
- 定义:map[K]V,map[k1] map[k2]V(复合kv)
m := map[string]string {
"name":"ccmouse"
}
var m3 map[string]int //m3 == nil
- 遍历,使用range,遍历时无序的
for k,v ;= range m{
fmt.println(k,v)
}
- 如果key不存在于map中,会获取初始值没是一个空行
- 删除元素的时候,使用delete函数
map的key
- map使用哈希表,必须可以比较相等
- 除了slice,map,function的内建类型都可以作为key
- struct类型不包含上述字段,也可以作为key
map的实例
寻找最长的不含有重复字符的子串长度。
比如输入abcabcabcbb->abc
- 对于每一个字母X:lastOccurred[x]不存在,或者<start->无需操作
- lastOccurred[x]>=start->更新start
- 更新lastOccurred[x],更新maxlength
func lengthOfNonRepeatingSubStr(s string) int {
lastOccurred := make(map[byte]int)
start := 0
maxLength := 0
for i, ch := range []byte(s) {
if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
start = start + 1
}
if i-start+1 > maxLength {
maxLength = i - start + 1
}
lastOccurred[ch] = i
}
return maxLength
}
字符和字符串的处理
- 较底层
func main() {
s := "Yes我爱慕课网!"
for i, ch := range s {
//ch is a rune
fmt.Printf("(%d %X)", i, ch)
}
fmt.Println()
}
- 较上层
for i, ch := range []rune (s) {
fmt.Printf("(%d %c)",i,ch)
}
fmt.Println()
rune相当于go的char
- 使用range遍历pos,rune对
- 使用utf8.RuneCountInString获得字符数量
- 使用len获得字节长度
- 使用[]byte获得字节
字符串其他操作
- strings包中的工具
- Fileds、Split、Join
- Contains、Index
- ToLower、ToUpper
- Trim、TrimRight、TrimLeft