【Go学习】slice切片的本质及操作——切片的追加、删除、插入等

本文深入探讨Go语言切片的本质,包括切片的声明、追加、删除、插入操作以及copy的使用。讨论了在不同情况下,如初始化大小、容量对追加操作的影响,并解释了如何利用切片指针实现数据共享。通过实例解析了append操作如何处理底层数组扩容,并展示了如何避免不必要的切片变量创建。
摘要由CSDN通过智能技术生成

【Go学习】slice切片的本质及操作——切片的追加、删除、插入等

切片的本质

一个切片是一个数组切割区间的描述。它包含了指向数组的指针,切割区间的长度,和容量(切割区间的最大长度),如下图所示:
这里写图片描述

假如使用 make([]byte, 5) 创建的切片变量s的结构如下图所示:
这里写图片描述

长度是切片引用的元素数目。容量是底层数组的元素数目(从切片指针开始)。关于长度和容量和区域将在下一个例子说明。

下面这个例子,我们继续对 s 进行切分,观察切片的数据结构和它引用的底层数组:

s = s[2:4]

这里写图片描述
注意上图中,这个时候切片的长度是2,但是切片的容量是3,容量是底层数组的元素数目(从切片指针开始),从上图指针出开始向右数,确实是3,注意长度和容量的区别。

切片并不复制整个切片元素。它创建一个新的切片执行同样的底层数组。这使得切片操作和数组索引一样高效。因此,通过一个新切片修改元素同样会影响到原始的切片。

d := []byte{
  'r', 'o', 'a', 'd'}
e := d[2:] 
// e == []byte{
  'a', 'd'}
e[1] = 'm'
// e == []byte{
  'a', 'm'}
// d == []byte{
  'r', 'o', 'a', 'm'}

前面创建的切片 s 长度小于它的容量。我们可以增长切片的长度为它的容量:

s = s[:cap(s)]

这里写图片描述
上图中,切片长度和切片容量是一样的,都是3。

切片增长不能超出其容量。增长超出切片容量将会导致运行时异常,就像切片或数组的索引超出范围引起异常一样。同样,不能使用小于零的索引去访问切片之前的元素。

对切片有了一个整体的认识之后,下来我们结合一些实例来进行操作。

一、一般操作

1,声明变量,go自动初始化为nil,长度:0,地址:0,nil
package main

import (
    "fmt"
)

func main(){
    var ss []string;
    fmt.Printf("length:%v \taddr:%p \tisnil:%v",len(ss),ss, ss==nil)    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值