深度剖析Golang中的Slice切片、Map和字符串处理| 青训营笔记

121 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记

切片(Slice) 重要!

 arr := [...]int {0,1,2,3,4,5,6,7}
 s := arr[2,6]   //2 3 4 5
 s [0] = 10   //arr的值变为[0 1 10 3 4 5 6 7]
  • Slice 本身没有数据,是对底层array的一个view

Slice 可以 Reslice

Slice的扩展

  • Slice可以向后扩展,不可以向前扩展
  • s[i] 不可以超越len(s), 向后扩展不可以超越底层数组cap(s)
 package main
 import "fmt"
 func main() {
     arr := [...]int {1,2,3,4,5,6,7}
     s1 := arr[2:6]
     s2 := s1[3:5]
     fmt.Println("s1= ", s1) //s1 = [2 3 4 5]         
     fmt.Println("s2= ", s2)  //s2 = [5 6] 
 }

Slice的扩展.jpg

Slice实现.jpg

Slice添加元素

  • 添加元素时如果超越cap, 系统会重新分配更大的底层数组,原来的数组(可能会被垃圾回收掉)
  • 由于值传递的关系,必须接受append的返回值
  • s = append(s, val)
  • s := make([]int, 16, 32) // len, cap
 package main
 import "fmt"
 func printSlice(s []int) {
     fmt.Printf("len=%d,cap=%d",len(s),cap(s))
 }
 func main(){
     s1 := []int{2,4,6,8}
     printSlice(s1)
     
     s2 := make([]int, 16)
     printSlice(s2)
     
     s3 := make([]int, 10, 32)
     printSlice(s3)
     
     //len=4, cap=4
     //len=16, cap=16
     //len=10, cap=32
 ​
 }

Slice复制元素

copy(destination,source)

Slice删除元素

 s2 := []int{2,4,6,8,0,0,0,0,0,0,0}
 fmt.Println("Deleting elements from slice") //delete 8
 s2 = append(s2[:3],s2[4:]...)
 ​
 fmt.Println("Popping from front")
 front := s2[0]
 s2 = s2[1:]
 ​
 fmt.Println("Popping from back")
 tail := s2[len(s2) -1]
 s2 = s2[:len(s2) - 1]

Map

  • 创建:make(map[string]int)
  • 获取元素:m[key]
  • key不存在时,获得Value类型的初始值
  • 用value, ok := m[key] 来判断是否存在key
  • 用delete删除一个key
  • 遍历Map,不保证遍历顺序
  • Map还可嵌套map
 package main
 ​
 import "fmt"
 ​
 func main() {
     m := map[string]string{
         "name":    "ccmouse",
         "course":  "golang",
         "site":    "imooc",
         "quality": "notbad",
     }
     fmt.Println(m)
     
     m2 := make(map[string]int) //m2 == empty map
     var m3 map[string]int //m3 == nil
     
     fmt.Println("Traversing map")
     for k, v := range m {
         fmt.Println(k, v) //无序的
         
     //取不存在的值时,输出一个空串""
     
 }

map的key

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

字符串处理

  • rune相当于go的char
  • 使用range遍历pos, rune对
  • 使用utf8.RuneCountInString获得字符数量
  • 使用[]byte获得字节

其他字符串操作

  • Fields, Split, Join
  • Contains, Index
  • ToLower, ToUpper
  • Trim, TrimRight, TrimLeft
 package main
 import (
     "fmt"
     "math"
 )
 func main() {
     var a = "initial";
     var d = true;
     f := float32(e);
 }
 package main
 import (
     "fmt"
     "math/rand"
 )
 func main {
     maxNum := 100
     rand.Seed(time.Now(),UnixNano()) //时间戳设置随机数种子
     secretNumber := rand.Intn(maxNum)
     fmt.Println("The secretnumber is ", secretNumb)
 }

\