Go学习笔记06-内建容器

Go学习笔记06-内建容器


数组

定义数组:

  1. //这样定义数组编译器自动初始化每个元素为0 
  2. var arr1 [5]int 
  3.  
  4. //这样定义数组需要手动初始化数组 
  5. arr2 := [3]int{1, 3, 5
  6.  
  7. //这样可以让编译器自动计算数组长度 
  8. arr3 := [...]int{2, 4, 6, 8, 10
  9.  
  10. //定义二维数组 
  11. var grid [4][5]bool 

·数量写在类型前面

遍历数组可用 for 循环语句,如:

  1. //用len()函数获取数组长度 
  2. for i := 0;i < len(arr3); i++{ 
  3. fmt.Println(arr3[i]) 

可以用range关键字获取数组的下标和值

  1. //用 range 关键字获取数组的下标和值 
  2. for i, v := range arr3{ 
  3. //i为数组下标,v为值 
  4. fmt.Println(i, v) 
  5.  
  6. //只获取数值,下标值用 _ 代替 
  7. for _, v := range arr3{ 
  8. fmt.Println(v) 

Go语言中数组是值类型

  • [10]int和[20]int被视为不同的类型
  • 函数调用时会拷贝数组
  • Go语言中一般不直接使用数组

*切片(Slice)

定义一个数组 arr := […]int{0, 1, 2, 3, 4, 5, 6, 7}
那么 s := arr[2:6]就叫做数组arr的一个切片,其值为[2, 3, 4, 5]。

  1. arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7
  2.  
  3. //获取数组arr下标从2~5的元素,不包括下标为6的元素 
  4. fmt.Println("arr[2:6] =", arr[2:6]) 
  5. //获取从第一个元素到下标为5的元素 
  6. fmt.Println("arr[:6] =", arr[:6]) 
  7. //获取从下标为2的元素及其后所有的元素 
  8. fmt.Println("arr[2:] =", arr[2:]) 
  9. //获取整个数组的元素 
  10. fmt.Println("arr[:] =", arr[:]) 

slice即切片不是值类型,切片是底层数组的一个视图(view),对切片做的变更会影响到原数组。

切片可以再对其进行reslice操作。

切片的扩展
Slice扩展
Slice扩展解析

Slice的操作

Slice添加元素

  1. arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7
  2. //s1 = [2, 3, 4, 5] 
  3. s1 := arr[2:6
  4. //s2 = [5, 6] 
  5. s2 := s1[3:5
  6. //s3 = [5, 6, 10] 
  7. s3 := append(s2, 10
  8. //s4 = [5, 6, 10, 11] 
  9. s4 := append(s3, 11
  10. //s5 = [5, 6, 10, 11, 12] 
  11. s5 := append(s4, 12
  12.  
  13. //s4, s5是不同的数组的视图 
  • 添加元素时如果超越cap,系统会重新分配一个更大的底层数组
  • 由于是值传递,必须接收append的返回值

创建Slice

  1. //未初始化的Slice缺省值是 nil 
  2. var s []int 
  3.  
  4. //用make创建Slice,slice长度为6 
  5. s2 := make([]int, 6
  6. //用make创建Slice,slice长度为10,底层数组长度为32 
  7. s3 := make([]int, 10, 32

复制Slice

  1. //复制s1,并存储到s2中 
  2. copy(s2, s1) 

Map

创建map

  1. //创建map,m := map[Key_Type]Value_Type 
  2. m := map[string]string
  3. "name": "Bob"
  4. "course": "golang"
  5. "site": "imooc"
  6. "quality": "not bad" 
  7.  
  8. //用make创建map,缺省值为 empty map 
  9. m2 := make(map[string]int
  10.  
  11. //这样创建map,缺省值为nil 
  12. var m3 := map[string]int 

遍历Map

  1. //map的遍历同数组遍历操作 
  2. for k, v := range m{ 
  3. fmt.Println(k, v) 

获取元素

  1. courseName := m["course"
  2.  
  3. //用此方法可以判断map中是否含有key为cause的值 
  4. if causeName, isOk := m["cause"]; isOk{ 
  5. fmt.Println(causeName) 
  6. }else
  7. fmt.Println("Key does not exisit."

删除元素

  1. //用delete删除map元素 
  2. delete(m, "name"

map小结
Map操作
Map的Key
遍历Map

map示例

题干:寻找最长不含有重复字符的子串的长度
如:abcabcbb -> abc
bbb -> b
pwwkew -> wke

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func lengthOfNoneRepeatSubStr(s string) int
  6. last := make(map[byte]int
  7. start := 0 
  8. maxLength := 0 
  9.  
  10. for i, ch := range []byte(s){ 
  11. if lastI, isOk := last[ch]; isOk && lastI >= start { 
  12. start = lastI + 1 
  13. if i - start + 1 > maxLength{ 
  14. maxLength = i - start + 1 
  15. last[ch] = i 
  16.  
  17. return maxLength 
  18.  
  19. func main()
  20. fmt.Println(lengthOfNoneRepeatSubStr("abcabcbb")) 
  21. fmt.Println(lengthOfNoneRepeatSubStr("kkkkkkkkk")) 
  22. fmt.Println(lengthOfNoneRepeatSubStr("pwwkew")) 
  23. fmt.Println(lengthOfNoneRepeatSubStr("0123456789")) 

字符处理

在Go语言中,rune相当于char类型

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func main()
  6. s := "Yes青青子衿悠悠我心" 
  7. for _, b := range []byte(s){ 
  8. fmt.Printf("%X ", b) 
  9.  
  10. for i, ch := range s{ 
  11. fmt.Printf("(%d, %X) ", i, ch) 
  12.  
  13. fmt.Println() 
  • 使用utf8.RuneCountInString获取字符数量
  • 使用len获取字节长度
  • 使用[]byte获取字节

寻找最长不含有重复字符的子串的长度支持中文字符版本

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func lengthOfNoneRepeatSubStr(s string) int
  6. last := make(map[rune]int
  7. start := 0 
  8. maxLength := 0 
  9.  
  10. for i, ch := range []rune(s){ 
  11. if lastI, isOk := last[ch]; isOk && lastI >= start { 
  12. start = lastI + 1 
  13. if i - start + 1 > maxLength{ 
  14. maxLength = i - start + 1 
  15. last[ch] = i 
  16.  
  17. return maxLength 
  18.  
  19. func main()
  20. fmt.Println(lengthOfNoneRepeatSubStr("abcabcbb")) 
  21. fmt.Println(lengthOfNoneRepeatSubStr("kkkkkkkkk")) 
  22. fmt.Println(lengthOfNoneRepeatSubStr("pwwkew")) 
  23. fmt.Println(lengthOfNoneRepeatSubStr("0123456789")) 

有关字符的操作在包 strings 中。

猜你喜欢

转载自www.cnblogs.com/vocaloid-fan1995/p/10566866.html