ToB企服应用市场:ToB评测及商务社交产业平台

标题: Go语言数组与切片学习总结 [打印本页]

作者: 天津储鑫盛钢材现货供应商    时间: 2023-11-23 08:24
标题: Go语言数组与切片学习总结
一.数组

(1)声明数组与打印
  1. var 变量名 [大小]变量类型
  2. //数组的声明
  3. var nums [4]int      
  4. //数组的赋值
  5. nums[0] = 1
  6. nums[1] = 2
  7. nums[2] = 3
  8. nums[3] = 4
  9. /***************数组的打印*************/
  10. fmt.Printf("%T\n", nums)     //打印数组的类型:[4]int
  11. fmt.Println(nums[3])         //打印单个数组的值:4
  12. fmt.Println("长度:", len(nums))    //打印数组的长度:4
  13. fmt.Println("容量:", cap(nums))    //打印数组的容量:4
复制代码
(2)数组的初始化

在go语言中,数组有多种初始化方式。
  1.         //1、常量的初始化定义数组
  2.         var arrs1 = [5]int{1, 2, 3, 4, 5}
  3.         //2、快速定义数组
  4.         arrs2 := [5]int{6, 7, 8, 9, 10}
  5.         //3、定义不确定长度的数组
  6.         arrs3 := [...]string{"hello", "xuexiangban", "kuangshenshuo"}
  7.         //4、给指定下标进行赋值操作
  8.         arrs4 := [5]int{1: 100, 3: 200}//给下标为1赋值为100,下标为3赋值为200
复制代码
(3)数组的遍历

  1.         //1、for循环遍历数组
  2.         arr1 := [5]int{1, 2, 3, 4, 5}    //创建数组
  3.         for i := 0; i < len(arr1); i++ {
  4.                 fmt.Println(arr1[i])
  5.         }
  6. /*输出结果:
  7. 1
  8. 2
  9. 3
  10. 4
  11. 5
  12. */
复制代码
  1.         //2、forage循环遍历数组
  2.         for index, value := range arr1 { //index下标,value对应的值
  3.                 fmt.Println(index, value)
  4.         }
  5. /*输出结果:
  6. 0 1
  7. 1 2
  8. 2 3
  9. 3 4
  10. 4 5
  11. */
复制代码
(4)数组是值传递类型

  1.         arr1 := [3]int{1, 2, 3}         //创建数组1:整型
  2.         arr2 := [2]string{"hello", "xuexiangban"}   //创建数组2:字符型
  3.         arr3 := arr1                //创建数组3直接被赋值数组1
  4.         fmt.Println(arr1, arr3)   //打印结果:[1 2 3] [1 2 3]
  5.         arr3 = [3]int{4, 5, 6}    //重新赋值
  6.         fmt.Println(arr1, arr3) //[1 2 3] [4 5 6]
复制代码
(5)多维数组

  1. var 变量名[SIZE1][SIZE2]...[SIZEN]变量类型
复制代码
  1.         arr := [3][4]int{
  2.                 {1, 2, 3, 4},
  3.                 {5, 6, 7, 8},
  4.                 {9, 10, 11, 12},
  5.         }
复制代码
  1.         //forage循环输出
  2.         for _, i := range arr {
  3.                 fmt.Println(i)        //打印外层
  4.                 fmt.Println("=========")   //打印内层
  5.                 for _, i2 := range i {
  6.                         fmt.Println(i2)
  7.                 }
  8.         }
  9. /*打印结果:
  10. [1 2 3 4]
  11. =========
  12. 1
  13. 2
  14. 3
  15. 4
  16. [5 6 7 8]
  17. =========
  18. 5
  19. 6
  20. 7
  21. 8
  22. [9 10 11 12]
  23. =========
  24. 9
  25. 10
  26. 11
  27. 12
  28. */
复制代码
二.切片

Go语言切片是对数组的抽象
go语言数组的长度是不可改变的切片的长度是不固定的可以追加元素,在追加时可能使切片的容量增大
切片是一种方便、灵活且强大的包装器,切片本身没有任何数据,他们只是对现有数组的引用
切片与数组相比,不需要设定长度,在[]中不用设定值,相对来说比较自由
(1)定义创建切片

切片与数组在定义时不同,可以不用指定长度容量
  1.         //1、定义一个切片,里面不添加数据,打印输出
  2.         s1 := []int{}
  3.         fmt.Println(s1) //输出结果:[]
  4.         //2、定义切片向里面添加数据,打印输出类型
  5.         s2 := []int{1, 2, 3}
  6.         fmt.Println(s2)         //输出结果:[1 2 3]
  7.         fmt.Printf("%T", s2)   //输出结果[]int
复制代码
补充:长度(length)和容量(cap)区别

(2)make函数创建切片

make函数创建切片,可以指定切片的长度和容量
  1. make([]T,length,capactity)   //类型,长度,容量
复制代码
  1.         //1、通过make函数来创建切片
  2.         s1 := make([]int, 5, 10) //长度:5,容量为10
  3.         //2、给切片里面的元素进行赋值
  4.         s1[0] = 100
  5.         //3、打印输出长度,容量
  6.         fmt.Println(s1)
  7.         fmt.Println("长度:", len(s1))
  8.         fmt.Println("容量:", cap(s1))
复制代码
(3)切片扩容append

  1.         //1、创建一个切片s1
  2.         s1 := make([]int, 2, 4)
  3.         fmt.Println("追加数据前的长度和容量:", len(s1), cap(s1))
  4.         //2、s1通过append追加数据
  5.         s1 = append(s1, 1, 2, 3, 4) //追加数据,不是添加数据
  6.         fmt.Println(s1)
  7.         fmt.Println("追加数据后的长度和容量:", len(s1), cap(s1))
  8.         //        3、创建一个s2,将s2中数据追加到s1
  9.         s2 := make([]int, 3, 3)
  10.         s2 = []int{1, 2, 3}
  11.         s1 = append(s1, s2...) //将s2里面的数据追加到s1
  12.         fmt.Println(s1)
复制代码
(4)在已有数组上创建切片

从已有的数组上,直接创建切片,该切片的底层数组就是当前的数组,长度是从start到end切到的数据量,但是容量从start到数组的末尾。
从数组上创建的切片,地址与数组是一样的,因此修改数组或切片的某个值,对应的数组/切片的值也会改变
slice := arr[start:end]
  1.         //定义数组和其切片
  2.         arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  3.         s1 := arr[:5]  //切片从1-5 [1 2 3 4 5]
  4.         s2 := arr[4:8] //[5 6 7 8]
  5.         s3 := arr[5:]  //[6 7 8 9 10]
  6.         s4 := arr[:]   //[1 2 3 4 5 6 7 8 9 10]
  7.         fmt.Println(s1)   //[1 2 3 4 5]
  8.         fmt.Println(s2)   //[5 6 7 8]
  9.         fmt.Println(s3)   //[6 7 8 9 10]
  10.         fmt.Println(s4)   //[1 2 3 4 5 6 7 8 9 10]
  11.         //修改数组的某个值
  12.         arr[0] = 100 //将数组元素值进行更换
  13.         fmt.Println(arr)      //[100 2 3 4 5 6 7 8 9 10]
  14.         fmt.Println(s1)               //[100 2 3 4 5 6 7 8 9 10]
  15.         //修改切片的某个值
  16.         s1[1] = 100
  17.         fmt.Println(arr)    //[100 100 3 4 5 6 7 8 9 10]
  18.         fmt.Println(s1)            //[100 100 3 4 5]
  19.     //查看数组和对应切片的地址
  20.         fmt.Printf("%p\n", s1)   //0xc0000ac0f0
  21.         fmt.Printf("%p\n", &arr)  //0xc0000ac0f0
复制代码
(5)切片是引用类型

  1.         s1 := []int{1, 2, 3, 4, 5}
  2.         s2 := s1
  3.         s2[0] = 100
  4.         fmt.Println(s1, s2)          //切片2里元素发生变化,切片1也会跟随着变化
  5.         fmt.Printf("%p\t%p", s1, s2) //说明切片的copy指向的是地址
复制代码
(6)copy深拷贝与浅拷贝

实现切片的深拷贝
  1.         //1、通过for循环实现切片的深拷贝
  2.         s1 := []int{1, 2, 3, 4}
  3.         s2 := make([]int, 0, 0)
  4.         for i := 0; i < len(s1); i++ {
  5.                 s2 = append(s2, s1[i])
  6.         }
  7.         fmt.Println(s1, s2)
  8.         //2、通过copy操作实现深拷贝
  9.         s3 := []int{5, 6, 7, 8}
  10.         fmt.Println(s1, s3)
  11.         copy(s3, s1) //(接收者,传递者) 将s1 copy 给s3
  12.         fmt.Println(s1, s3)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4