Go基础之切片

切片的出现目的

解决数组的局限性

例如:改变数组的长度、给数组增加新的元素

切片

切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。切片是一个引用类型,它的内部结构包含地址、长度和容量。

切片其实是一个结构体包括长度,容量,底层数组

切片的定义

var name[ ]T,其中name:表示变量名。T:表示切片中的元素类型。

func main() {
	// 声明切片类型
	var x []string              //声明一个字符串切片
	var y = []int{}             //声明一个整型切片并初始化
	var m = []bool{false, true} //声明一个布尔切片并初始化
	var n = []bool{false, true} //声明一个布尔切片并初始化
	fmt.Println(x)              //[]
	fmt.Println(y)              //[]
	fmt.Println(m)              //[false true]
	fmt.Println(x == nil)       //true
	fmt.Println(y == nil)       //false
	fmt.Println(m == nil)       //false
	// fmt.Println(m == n)   //切片是引用类型,不支持直接比较,只能和nil比较
}

切片的长度和容量

通过使用内置的len()函数求长度,使用内置的cap()函数求切片的容量。

切片表达式

切片表达式从字符串、数组、指向数组或切片的指针构造子字符串或切片。它有两种变体:一种指定low和high两个索引界限值的简单的形式,另一种是除了low(左包含)和high(右不包含)索引界限值外还指定容量的完整的形式。

完整切片表达式

a[low:high:max]

简单形式

a[low:high]


a[2:] // 等同于 a[2:len(a)] a[:3] // 等同于 a[0:3] a[:] // 等同于 a[0:len(a)]

make()函数构造切片

动态创建一个切片,使用内置的make()函数

make([]T,size,cap)

T:切片的元素类型

size:切片中元素的数量

cap:切片的容量

func main(){

a:=make([]int ,2,10)

fmt.println(a) //[0 0]

fmt.println(len(a)) //2

fmt.println(cap(a)) //10

}

切片的本质就是对底层数组的封装,它包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)

判断切片是否为空:使用len(s)==0来判断。

切片不能直接比较

切片之间是不能比较的,我们不能使用==操作符来判断两个切片是否含有全部相等元素。 切片唯一合法的比较操作是和nil比较。 一个nil值的切片并没有底层数组,一个nil值的切片的长度和容量都是0。但是我们不能说一个长度和容量都是0的切片一定是nil。对一个切片的修改会影响另一个切片的内容。

切片遍历

func main() {
	s := []int{1, 3, 5}

	for i := 0; i < len(s); i++ {
		fmt.Println(i, s[i])
	}

	for index, value := range s {
		fmt.Println(index, value)
	}
}

append()方法为切片添加元素

可以一次添加一个,也可以一次添加多个。

当底层数组容量不够时,开始扩容append()函数将元素追加到切片的最后并返回该切片。

切片numSlice的容量按照1,2,4,8,16这样的规则自动进行扩容,每次扩容后都是扩容前的2倍。

func main(){
	var s []int
	s = append(s, 1)        // [1]
	s = append(s, 2, 3, 4)  // [1 2 3 4]
	s2 := []int{5, 6, 7}  
	s = append(s, s2...)    // [1 2 3 4 5 6 7]
}

使用copy()函数复制切片

copy(destSlice, srcSlice []T)

其中:

srcSlice: 数据来源切片

destSlice: 目标切片

func main() {
	// copy()复制切片
	a := []int{1, 2, 3, 4, 5}
	c := make([]int, 5, 5)
	copy(c, a)     //使用copy()函数将切片a中的元素复制到切片c
	fmt.Println(a) //[1 2 3 4 5]
	fmt.Println(c) //[1 2 3 4 5]
	c[0] = 1000
	fmt.Println(a) //[1 2 3 4 5]
	fmt.Println(c) //[1000 2 3 4 5]
}

从切片中删除元素

从切片a中删除索引为index的元素,操作方法是a = append(a[:index], a[index+1:]…)

func main() {
	// 从切片中删除元素
	a := []int{30, 31, 32, 33, 34, 35, 36, 37}
	// 要删除索引为2的元素
	a = append(a[:2], a[3:]...)
	fmt.Println(a) //[30 31 33 34 35 36 37]
}
总结一下就是:要从切片a中删除索引为index的元素,操作方法是a = append(a[:index], a[index+1:]...)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终生成长者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值