1. package main
    2. import "fmt"
    3. func main() {
    4. /*1、回顾数组的声明以及初始化*/
    5. // var arr1 [3]int
    6. // arr1[0] = 10
    7. // arr1[1] = 20
    8. // arr1[2] = 30
    9. // fmt.Println(arr1)
    10. // var arr2 = [3]string{"php", "java", "golang"}
    11. // fmt.Println(arr2)
    12. // var arr3 = [...]string{"php", "java", "golang"}
    13. // fmt.Println(arr3)
    14. // var arr4 = [...]int{1: 2, 2: 3}
    15. // fmt.Println(arr4)
    16. /*2、切片的声明 初始化*/
    17. // var arr1 []int
    18. // fmt.Printf("%v - %T - 长度:%v\n", arr1, arr1, len(arr1))
    19. // var arr2 = []int{1, 2, 34, 45}
    20. // fmt.Printf("%v - %T - 长度:%v\n", arr2, arr2, len(arr2))
    21. // var arr3 = []int{1: 2, 2: 4, 5: 6}
    22. // fmt.Printf("%v - %T - 长度:%v", arr3, arr3, len(arr3))
    23. var arr1 []int
    24. var arr2 = []int{1, 2, 34, 45}
    25. fmt.Println(arr1) //[]
    26. fmt.Println(arr1 == nil) //true golnag中申明切片以后 切片的默认值就是nil
    27. fmt.Println(arr2 == nil) //false
    28. }
    1. package main
    2. func main() {
    3. //切片的循环遍历
    4. // var strSlice = []string{"php", "java", "nodejs", "golang"}
    5. // for i := 0; i < len(strSlice); i++ {
    6. // fmt.Println(strSlice[i])
    7. // }
    8. // var strSlice = []string{"php", "java", "nodejs", "golang"}
    9. // for k, v := range strSlice {
    10. // fmt.Println(k, v)
    11. // }
    12. }
    1. package main
    2. import "fmt"
    3. func main() {
    4. //1、基于数组定义切片
    5. // a := [5]int{55, 56, 57, 58, 59}
    6. // b := a[:] //获取数组里面的所有值
    7. // fmt.Printf("%v-%T\n", b, b) //[55 56 57 58 59]
    8. // c := a[1:4]
    9. // fmt.Printf("%v-%T\n", c, c) //[56 57 58]
    10. // d := a[2:]
    11. // fmt.Printf("%v-%T\n", d, d) //[57, 58, 59]
    12. // e := a[:3] //表示获取第三个下标前面的数据
    13. // fmt.Printf("%v-%T\n", e, e) //[55, 56, 57]
    14. //2、基于切片定义切片
    15. // a := []string{"北京", "上海", "广州", "深圳", "成都", "重庆"}
    16. // b := a[1:]
    17. // fmt.Printf("%v-%T\n", b, b) //[上海 广州 深圳 成都 重庆]
    18. //3、关于切片的长度和容量
    19. // 长度:切片的长度就是它所包含的元素个数
    20. // 容量:切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。
    21. s := []int{2, 3, 5, 7, 11, 13}
    22. fmt.Printf("长度%d 容量%d\n", len(s), cap(s)) //长度6 容量6
    23. a := s[2:] //5, 7, 11, 13
    24. fmt.Printf("长度%d 容量%d\n", len(a), cap(a)) //长度4 容量4
    25. b := s[1:3] //3, 5
    26. fmt.Printf("长度%d 容量%d\n", len(b), cap(b)) //长度2 容量5
    27. c := s[:3] //2, 3, 5
    28. fmt.Printf("长度%d 容量%d\n", len(c), cap(c)) //长度3 容量6
    29. }
    1. package main
    2. import "fmt"
    3. func main() {
    4. /*1、切片声明和初始化的几种方法:*/
    5. // var arr1 []int
    6. // fmt.Printf("%v - %T - 长度:%v\n", arr1, arr1, len(arr1))
    7. // var arr2 = []int{1, 2, 34, 45}
    8. // fmt.Printf("%v - %T - 长度:%v\n", arr2, arr2, len(arr2))
    9. // arr3 := []string{"php", "java"}
    10. // fmt.Printf("%v - %T - 长度:%v\n", arr3, arr3, len(arr3))
    11. // var arr4 = []int{1: 2, 2: 4, 5: 6}
    12. // fmt.Printf("%v - %T - 长度:%v", arr4, arr4, len(arr4))
    13. //2、make()函数创建一个切片 make([]T, size, cap)
    14. var sliceA = make([]int, 4, 8)
    15. // fmt.Println(sliceA) //[0 0 0 0]
    16. fmt.Printf("%d--%d", len(sliceA), cap(sliceA))
    17. }
    1. package main
    2. import "fmt"
    3. func main() {
    4. // var sliceA = make([]int, 4, 8)
    5. // // fmt.Println(sliceA) //[0 0 0 0]
    6. // sliceA[0] = 10
    7. // sliceA[1] = 12
    8. // sliceA[2] = 40
    9. // sliceA[3] = 30
    10. // fmt.Println(sliceA)
    11. sliceB := []string{"php", "java", "go"}
    12. sliceB[2] = "golang"
    13. fmt.Println(sliceB)
    14. //golang中没法通过下标的方式给切片扩容
    15. // var sliceC []int
    16. // fmt.Printf("%v -- %v--%v", sliceC, len(sliceC), cap(sliceC)) //[] -- 0--0
    17. // sliceC[0] = 1
    18. // fmt.Println(sliceC)
    19. // golang中给切片扩容的话要用到append()方法
    20. }
    1. package main
    2. import "fmt"
    3. /*
    4. Go 语言的内建函数 append()可以为切片动态添加元素,每个切片会指向一个底层数组,这 个数组的容量够用就添加新增元素。当底层数组不能容纳新增的元素时,切片就会自动按照 一定的策略进行“扩容”,此时该切片指向的底层数组就会更换。“扩容”操作往往发生在 append()函数调用时,所以我们通常都需要用原变量接收 append 函数的返回值
    5. */
    6. func main() {
    7. //1、append方法的使用
    8. // var sliceA []int
    9. // sliceA = append(sliceA, 12)
    10. // sliceA = append(sliceA, 24)
    11. // fmt.Printf("%v - %v--%v", sliceA, len(sliceA), cap(sliceA)) //[12 24] - 2--2
    12. // var sliceA []int
    13. // sliceA = append(sliceA, 12, 23, 35, 465)
    14. // fmt.Printf("%v - %v--%v", sliceA, len(sliceA), cap(sliceA)) //[12 23 35 465] - 4--4
    15. //2、append方法还可以合并切片
    16. // sliceA := []string{"php", "java"}
    17. // sliceB := []string{"nodejs", "go"}
    18. // sliceA = append(sliceA, sliceB...)
    19. // fmt.Println(sliceA) //[php java nodejs go]
    20. //3、切片的扩容策略(了解)
    21. /*
    22. 1、首先判断,如果新申请容量(cap)大于 2 倍的旧容量(old.cap),最终容量(newcap) 就是新申请的容量(cap)。
    23. 2、否则判断,如果旧切片的长度小于 1024,则最终容量(newcap)就是旧容量(old.cap)的两 倍,即(newcap=doublecap),
    24. 3、否则判断,如果旧切片长度大于等于 1024,则最终容量(newcap)从旧容量(old.cap) 开始循环增加原来的 1/4,即(newcap=old.cap,for {newcap += newcap/4})直到最终容量 (newcap)大于等于新申请的容量(cap),即(newcap >= cap)
    25. 4、如果最终容量(cap)计算值溢出,则最终容量(cap)就是新申请容量(cap)。
    26. 需要注意的是,切片扩容还会根据切片中元素的类型不同而做不同的处理,比如 int 和 string 类型的处理方式就不一样。
    27. */
    28. var sliceA []int
    29. for i := 1; i <= 10; i++ {
    30. sliceA = append(sliceA, i)
    31. fmt.Printf("%v 长度:%d 容量:%d\n", sliceA, len(sliceA), cap(sliceA))
    32. }
    33. }
    1. package main
    2. import "fmt"
    3. func main() {
    4. /*
    5. 值类型 : 改变变量副本值的时候,不会改变变量本身的值
    6. 引用类型:改变变量副本值的时候,会改变变量本身的值
    7. */
    8. // 切片就是引用数据类型
    9. // sliceA := []int{1, 2, 3, 45}
    10. // sliceB := sliceA
    11. // sliceB[0] = 11
    12. // fmt.Println(sliceA)
    13. // fmt.Println(sliceB)
    14. /*
    15. [11 2 3 45]
    16. [11 2 3 45]
    17. */
    18. //1、copy()函数复制切片
    19. sliceA := []int{1, 2, 3, 45}
    20. sliceB := make([]int, 4, 4)
    21. copy(sliceB, sliceA)
    22. fmt.Println(sliceA)
    23. fmt.Println(sliceB)
    24. sliceB[0] = 111
    25. fmt.Println(sliceA) //[1 2 3 45]
    26. fmt.Println(sliceB) //[111 2 3 45]
    27. }
    1. package main
    2. import "fmt"
    3. func main() {
    4. // Go 语言中并没有删除切片元素的专用方法,我们可以使用切片本身的特性来删除元素
    5. a := []int{30, 31, 32, 33, 34, 35, 36, 37}
    6. // 要删除索引为 2 的元素 删除的元素:32 注意:append合并切片的时候最后一个元素要加...
    7. a = append(a[:2], a[3:]...)
    8. fmt.Println(a)
    9. //要删除35, 36
    10. sliceB := []int{30, 31, 32, 33, 34, 35, 36, 37}
    11. sliceB = append(sliceB[:5], sliceB[7:]...)
    12. fmt.Println(sliceB)
    13. }
    1. package main
    2. import "fmt"
    3. func main() {
    4. // s1 := "big"
    5. // byteStr := []byte(s1)
    6. // byteStr[0] = 'p'
    7. // fmt.Println(string(byteStr))
    8. s2 := "你好golang"
    9. runeStr := []rune(s2)
    10. fmt.Println(runeStr) //[20320 22909 103 111 108 97 110 103]
    11. runeStr[0] = '大'
    12. fmt.Println(string(runeStr))
    13. }
    1. package main
    2. import "fmt"
    3. func main() {
    4. /*
    5. 值类型 : 改变变量副本值的时候,不会改变变量本身的值 (数组、基本数据类型)
    6. 引用类型:改变变量副本值的时候,会改变变量本身的值 (切片)
    7. */
    8. s1 := make([]int, 3) //[0 0 0]
    9. s2 := s1 //将 s1 直接赋值给 s2,s1 和 s2
    10. s2[0] = 100
    11. fmt.Println(s1) //[100 0 0]
    12. fmt.Println(s2) //[100 0 0]
    13. }