经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
GO基础之切片
来源:cnblogs  作者:小禾点点  时间:2019/11/4 8:47:31  对本文有异议

一、什么是切片

Go语言切片是对数组的抽象。

  • Go数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组");
  • 与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
  • 切片本身没有任何数据,它们只是对现有数组的引用。
  • 切片与数组相比,不需要设定长度,在[ ]中不用设定值,相对来说比较自由
  • 从概念上面来说slice像一个结构体,这个结构体包含了三个元素:

切片的结构:

  • 〇指针,指向数组中slice指定的开始位置
  • 〇长度,SPslice的长度
  • 〇最大长度,也就是slice开始位置到数组的最后位置的长度

二、切片的使用

切片的声明

 

  1. s1 := make([]int, 5)
  2. s2 := make([]int, 5, 7)

 

切片的初始化:

 

 

  1. nums := []int{1, 2, 3, 4, 5}

len()和cap()函数

1、 切片的长度是切片中元素的数量。

2、 切片的容量是从创建切片的索引开始的底层数组中元素的数量。

3、 切片是可索引的,并且可以由len()方法获取长度,切片提供了计算容量的方 法cap(),可以测量切片最长可以达到多少。[数组计算cap()结果与len()相同]

4、 切片实际的是获取数组的某一部分,len切片<=cap切片<=len数组 

  1. package main
  2. import "fmt"
  3. func main() {
  4. s1 := make([]int, 5)
  5. s2 := make([]int, 5, 7)
  6. printSlice(s1) //length:5,cap=5,slice=[0 0 0 0 0]
  7. printSlice(s2) //length:5,cap=7,slice=[0 0 0 0 0]
  8. //创建切片
  9. nums := []int{1, 2, 3, 4, 5}
  10. printSlice(nums)
  11. //从切片中截取小切片
  12. nums1 := nums[1:4]
  13. printSlice(nums1) //length:3,cap=4,slice=[2 3 4]
  14. nums2 := nums[:3]
  15. printSlice(nums2) //length:3,cap=5,slice=[1 2 3]
  16. nums3 := nums[2:]
  17. printSlice(nums3) //length:3,cap=3,slice=[3 4 5]
  18. }
  19. func printSlice(slc []int) {
  20. fmt.Printf("length:%d,cap=%d,slice=%v \n", len(slc), cap(slc), slc)
  21. }
View Code

 

 三、切片的常用函数

(五)、append( ) 和 copy( )函数

1、函数append( ):

  • •往切片中追加新元素
  • •可以向 slice里面追加一个或者多个元素,也可以追加一个切片。
  • • append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的 其它slice。
  • •当使用 append追加元素到切片时,如果容量不够(也就是(cap-len)== 0),Go就会创建一个新的内存地址来储存元素(该方式效率较低)。

2、函数copy:*复制切片元素

  • •将源切片中的元素复制到目标切片中,返回复制的元素的个数
  • • copy方法是不会建立源切片与目标切片之间的联系。也就是两个切片不存 在联系,一个修改不影响另一个。
  1. package main
  2. import "fmt"
  3. func main() {
  4. //创建切片
  5. nums := []int{1, 2, 3, 4, 5}
  6. printSlice("nums", nums) //slice=nums,p=0xc00000c5d0,length:5,cap=5,slice=[1 2 3 4 5]
  7. //append 追加元素
  8. nums = append(nums, 10)
  9. printSlice("nums", nums) //slice=nums,p=0xc000014230,length:6,cap=10,slice=[1 2 3 4 5 10]
  10. a := []int{6, 7, 8, 9}
  11. //追加数组
  12. nums = append(nums, a...)
  13. printSlice("nums", nums) //slice=nums,p=0xc000014230,length:10,cap=10,slice=[1 2 3 4 5 10 6 7 8 9]
  14. //删除第一个元素
  15. nums = nums[1:]
  16. printSlice("nums", nums) //slice=nums,p=0xc000014238,length:9,cap=9,slice=[2 3 4 5 10 6 7 8 9]
  17. //删除最后一个元素
  18. nums = nums[:len(nums)-1]
  19. printSlice("nums", nums) //slice=nums,p=0xc000014238,length:8,cap=9,slice=[2 3 4 5 10 6 7 8]
  20. //删除中间的元素
  21. b := int(len(nums) / 2)
  22. nums = append(nums[:b], nums[b+1:]...)
  23. printSlice("nums", nums) //slice=nums,p=0xc000014238,length:7,cap=9,slice=[2 3 4 5 6 7 8]
  24. //切片copy
  25. nums2 := make([]int, len(nums), cap(nums)*2)
  26. //copy 的切片没有关联
  27. copy(nums2, nums)
  28. printSlice("nums2", nums2) //slice=nums,p=0xc000014238,length:7,cap=9,slice=[2 3 4 5 6 7 8]
  29. }
  30. func printSlice(name string, slc []int) {
  31. fmt.Printf("slice=%v,p=%p,length:%d,cap=%d,slice=%v \n", name, slc, len(slc), cap(slc), slc)
  32. }
View Code

3、使用make创建切片

  1. package main
  2. import "fmt"
  3. import "strconv"
  4. func main() {
  5. str := make([]string, 0, 16)
  6. printSlice("str", str)
  7. for i := 0; i < 5; i++ {
  8. str = append(str, strconv.Itoa(i))
  9. }
  10. printSlice("str", str)
  11. }
  12. func printSlice(name string, slc []string) {
  13. fmt.Printf("slice=%v,p=%p,length:%d,cap=%d,slice=%v \n", name, slc, len(slc), cap(slc), slc)
  14. }

 

原文链接:http://www.cnblogs.com/jalja/p/11782966.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号