package main

import "fmt"

func main() {

   // 1.声明一个整形切片
   var numList []int
   fmt.Println(numList)
   fmt.Println(numList == nil) // 切片是引用数据类型  true

   // 2.声明一个空切片
   var numListEmpty = []int{}
   fmt.Println(numListEmpty)

   // 3.make声明方式
   // make方法中第一个参数是指针 切片元素对应的底层数组元素位置
   // make方法中第二个参数是长度 切片中的元素个数
   // make方法中第三个参数是容量 从切片的开始位置到底层数据的结尾位置
   numListMake := make([]int, 3, 5)
   fmt.Println(len(numListMake)) // 获取切片的长度(判断切片是否为空)
   fmt.Println(cap(numListMake)) // 获取切片的容量
   fmt.Println(numListMake)

   // 4.对数组元素进行切片
   var arr = []string{"橙子都是橘子味的", "java", "Go", "Vue", "Redis"}
   // 从数组0的位置切片到第三个位置Go语言中切片返回元素不包含第三个位置的元素
   // 如果[:] 不写参数默认是整个切片
   arrList := arr[1:3]
   fmt.Println(arrList)

   // 5.追加切片元素
   var arrAdd = []string{"橙子都是橘子味的"} // cap(arrAdd) = 1
   // 向切片追加一个元素
   arrAdd = append(arrAdd, "java") // cap(arrAdd) = 2
   // 向切片追加两个元素
   arrAdd = append(arrAdd, "Go", "Vue") // cap(arrAdd) = 4
   // 向切片追加一个切片 需要... 解引用 (如果每次追加数据超过切片容量Go语言会新建一个数组
   // 将数组值复制到新的数组并并两倍的方式扩容返回新的数组地址)
   arrAdd = append(arrAdd, []string{"Redis", "RabbitMq"}...) // cap(arrAdd) = 8
   fmt.Println(arrAdd)

   // 6.二维切片
   arrLists := [][]string{
      {"1", "橙子都是橘子味的"},
      {"2", "java"},
      {"3", "Go"},
   }
   fmt.Println(arrLists)

}