• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Go语言中切片的使用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1 概述

其中切片是基于数据中连续片段的引用,是一个引用类型。与数组不同的是,切片的长度可以在运行时修改。使用上可以将切片看作是长度可变的数组。即使超过了底层数组的最大长度,也可以继续扩容。

图例为:

切片的实现是由一个底层数组以及其上面的动态位置,尺寸来实现。由内部由指向起始元素的指针、元素数量length和容量capacity组成。其中:

  • 指针ptr,用于指向切片在底层数组的起始位置。
  • 尺寸len,用于记录切片内元素数量。
  • 容量cap,当前切片最大容量,也就是底层数组的容量。可以动态分配。

当使用不定数量参数时,函数得到的参数也是切片类型。

切片为引用类型,因此切片的默认初始值为nil。

2 创建切片

语法整理如下:

  • []type,切片类型
  • []type{v1, v2, v3},定义时指定初始值
  • make([]type, len),make开辟内存空间,指定类型和长度
  • make([]type, len, cap),make开辟切片内存空间,指定类型,长度和容量
  • arr[start?max],由数组或切片创建
    其中:
    开始索引start,表示从哪个元素开始。
    结束索引end,表示到哪个索引终止,不包括该索引元素。
    最大索引max,用来确定容量,容量=最大索引-开始索引。默认情况下,最大索引的值为len()。

3 for-range 遍历

for i, v := range sli {
  fmt.Println(i, v)
}

4 append() 扩容

func append(s []T, x …T) []T
使用 buildin 函数 append() 可以向切片中添加新元素。添加时存在两种情况:

  • 切片容量充足,在原切片基础上追加。
  • 切片容量不足,会分配新的切片空间来保证已有切片元素和新增元素的存储。
s1 := make([]int, 3, 5)
s2 := append(s1, 1, 2)
s2[1] = 42
fmt.Println(s1)
fmt.Println(s2)
// [0 42 0] 修改s2,s1也会更改
// [0 42 0 1 2]

s3 := make([]int, 3, 5)
s4 := append(s1, 1, 2, 3, 4, 5)
s4[1] = 42
fmt.Println(s3)
fmt.Println(s4)
// [0 0 0] 修改s4,s3不会更改,因为容量不足,开辟了新空间
// [0 42 0 1 2 3 4 5]

可以将一个切片到另一个切片后,需要使用 切片… 来实现:

append(slice1, slice2…)

5 copy() 拷贝切片

由于默认是地址传递赋值方式,当需要得到一个新的拷贝时,需要使用函数copy()来实现。
copy(新切片,旧切片),利用旧切片复制一份新切片。

s3 := []int{10, 20, 30}
var s4 = make([]int, 3)
copy(s4, s3)

6 常用操作

配合 make,append,copy 可以完成切片的常用操作。

通过索引 i 删除切片中某个元素

s2 := append(s1[:i], s1[i+1:]...)

删除索引 i-j 的元素

s2 := append(append([]int{}, s1[:i]...), s1[j:]...)

在索引 i 的位置插入元素

s2 := append(s1[:i], append([]int{v}, s1[i:]...)...)

在 s1 索引 i 的位置插入切片 s2 的所有元素

s1 = append(s1[:i], append(s2, s1[i:]...)...)

栈操作模拟

// 栈模拟(只在一端的头,添加或者删除元素)
var s1 = []int{6, 7, 8, 9, 10, 11}
// 操作末尾
// 入栈
s1 = append(s1, 12)
fmt.Println(s1)
// 出栈
v := s1[len(s1)-1]
s1 = s1[:len(s1)-1]
fmt.Println(v, s1)

// 操作头部
// 入栈
s1 = append([]int{5}, s1...)
fmt.Println(s1)
// 出栈
v := s1[0]
s1 = s1[1:]
fmt.Println(v, s1)

队列操作模拟

// 模拟队列
// 头进尾出
var s1 = []int{6, 7, 8, 9, 10, 11}
s1 = append([]int{5}, s1...)
v := s1[len(s1)-1]
s1 = s1[:len(s1)-1]

// 尾进头出
var s1 = []int{6, 7, 8, 9, 10, 11}
s1 = append(s1, 12)
v := s1[0]
s1 = s1[1:]

完!
原文出自:小韩说课
微信关注:小韩说课




鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
GO基础之变量的使用发布时间:2022-07-10
下一篇:
go调度: 第一部分-OS调度(操作系统调度)发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap