一.通过数组产生切片

  • 定义数组后,取出数组中一个片段,这个片段就是切片类型

    1. names := [3]string{"老张", "佳明哥", "smallming"}
    2. s := names[0:2] //包前不包后
    3. fmt.Printf("%T", s) //输出:[]string
    4. fmt.Println(s) //输出:[老张 佳明哥]
  • 切片是指针,指向数组元素地址,修改切片的内容,数组的内容会跟随变化

    1. names := [3]string{"老张", "佳明哥", "smallming"}
    2. s := names[0:2] //包前不包后
    3. fmt.Printf("%p %p",s,&names[0])//输出的地址是相同的
    4. s[0] = "Go语言"
    5. fmt.Println(s) //输出:[Go语言 佳明哥]
    6. fmt.Println(names) //输出:[Go语言 佳明哥 smallming]
  • 当切片内容在增加时

    • 如果增加后切片的长度没有超出数组,修改切片也是在修改数组
    • 如果增加后切片的长度超出数组,会重新开辟一块空间放切片的内容
    • 通过下面代码也正面了切片中内容存在一块连续空间(和数组一样)

      1. names := [3]string{"老张", "佳明哥", "smallming"}
      2. s := names[0:2] //包前不包后
      3. fmt.Printf("%p %p\n",s,&names[0])
      4. s[0] = "Go语言"
      5. s=append(s,"区块链")
      6. fmt.Println(s) //输出:[Go语言 佳明哥 区块链]
      7. fmt.Println(names) //输出:[Go语言 佳明哥 区块链]
      8. fmt.Printf("%p %p\n",s,&names[0])//地址相同
      9. s=append(s,"超出了数组长度")
      10. fmt.Println(s) //输出:[Go语言 佳明哥 区块链 超出了数组长度]
      11. fmt.Println(names) //输出:[Go语言 佳明哥 区块链]
      12. fmt.Printf("%p %p\n",s,&names[0])//切片地址改变

二.删除实现

  • Go语言标准库中没有提供删除的函数
  • 切片也可以取其中的一段形成子切片,利用这个特性可以实现删除效果
    1. num := []int {0,1,2,3,4,5,6}
    2. //要删除脚标为n的元素
    3. n:= 2
    4. num1 :=num[0:n]
    5. num1= append(num1,num[n+1:]...)
    6. fmt.Println(num1)