龙行博客

走路看风景,经历看人生,岁月留痕迹,人生留轨迹,17的历史,18的豪情,时间的匆忙,人生的风景,放开心胸往前走,成功再远行,放开理想往前走,梦想再行动。
现在位置:首页 > 编程语言 > Golang > Go基础-slice(切片)

Go基础-slice(切片)

龙行    Golang    2020-3-11    399    0评论    

Go基础-slice(切片)

在很多应用场景中,数组并不能满足我们的需求.在初始定义数组时,我们并不知道需要多大的数组,因此我们就需要"动态数组".在Go里面这种数据结构叫slice

slice并不是真正意义上的动态数组,而是一个引用类型.slice总是指向一个底层array,slice的声明也可以向array一样,并不需要长度.

// 和声明array一样,只是少了长度
var fslice []int

接下来我们可以声明一个slice,并初始化数据,如下所示:

slice := []byte{"a","b","c","d"}

slice可以从一个数组或一个已存在的slice中再次声明.slice通过array[i:j]来获取,其中i是数组的开始,j是结束为止,但不包含array[j],它的长度是j-1.

// 声明一个含有十个元素 元素类型为byte的数组
var ar = [10]byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}

// 声明两个含有byte的slice
var a,b  []byte

//a 指向数组的第三格元素开始,并到第五个元素结束,
a = ar[2:5]
//现在a含有的元素: ar[2],ar[2],ar[4]

//b是数组ar的另一个slice
b = ar[3:5]
// b 的元素是: ar[3]和ar[4]

注意slice和数组在声明时的区别,  声明数组时,方括号内写明了数组的长度...自动计算长度,而声明slice时,方括号内没有任何字符

slice有一些简便的操作

  • slice的默认开始位置是0,ar[:n]等价于ar[0:n]

  • slice的第二个序列默认是数组的长度,ar[n:]等价于ar[n:len(ar)]

  • 如果从一个数组里面直接获取slice,可以这样ar[:],因为默认第一个序列是0,第二个是数组的长度,即等价于ar[0:len(ar)]

下面这个例子展示了更多关于slice的操作

// 声明一个数组
var array = [10]byte{"a","b","c","d","e","f","g","h","i","j"}
// 声明两个slice
var aSlice,bSlice []byte

//演示一些简便操作
aSlice = array[:3]  //等价于aSlice = array[0:3] aSlice元素包含: a,b,c
aSlice = array[5:] // 等价于aSlice = array[5:10] aSlice包含元素: f,g,h,i,j
aSlice = array[:]  // 等价于aSlice = array[0:10] 这样aSlice包含了全部的元素

// 从slice中获取slice
aSlice = array[3:7]  // aSlice包含元素: d,e,f,g,len=4,cap=7
bSlice = aSlice[1:3] // bSlice 包含aSlice[1], aSlice[2] 也就是含有: e,f
bSlice = aSlice[:3]  // bSlice 包含 aSlice[0], aSlice[1], aSlice[2] 也就是含有: d,e,f
bSlice = aSlice[0:5] // 对slice的slice可以在cap范围内扩展,此时bSlice包含:d,e,f,g,h
bSlice = aSlice[:]   // bSlice包含所有aSlice的元素: d,e,f,g

slice是引用类型,所以当引用改变其中元素的值是,其它的素有引用都会改变该值,例如上面的aSlicebSlice,如果修改了aSlice中元素的值,那么bSlice相应的值也会改变.

从概念上面来说slice像一个结构体,这个结构体包含了三个元素:

  • 一个指针,指向数组中slice指定的开始位置

  • 长度,即slice的长度

  • 最大长度,也就是slice开始位置到数组的最后位置的长度

array_a := [10]byte{"a","b","c","d","e","f","g","h","i","j"}
Slice_a := array_a[2:5]

对于slice有几个有用的内置函数:

  • len获取slice的长度

  • cap获取slice的最大容量

  • appendslice里面追加一个或者多个元素,然后返回一个和slice一样类型的slice

  • copy函数copy从源slicesrc中复制元素到目标dst,并且返回复制的元素的个数

注:append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的其它slice.但当slice中没有生育空间(即(cap-len) ==0)时,此时将动态分配新的数组空间.返回的slice数组指针将指向这个空间,而原数组的内容将保持不变;其它引用此数组的slice则不受影响.

从Go1.2开始slice支持了三个参数的slice,之前我们一直采用这种方式在slice或者array基础上来获取一个slice

var array [10]int
slice := array[2:4:7]

上面这个的容量就是7-2,即5.这样这个产生的新的slice就没办法访问最后的三个元素.

如果slice是这样的形式array[:i:j],即第一个参数为空,默认值就是0.

评论一下 分享本文 赞助站长

赞助站长X

扫码赞助站长
联系站长
龙行博客
  • 版权申明:此文如未标注转载均为本站原创,自由转载请表明出处《龙行博客》。
  • 本文网址:https://www.liaotaoo.cn/340.html
  • 上篇文章:Go基础-map
  • 下篇文章:Go基础-array(数组)
  • go golang
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论
快捷导航
联系博主
在线壁纸
给我留言
四四五五
音乐欣赏
返回顶部