golang 定义一个空切片_GoLang基础数据类型-切片(slice)详解

本文详细介绍了Go语言中的切片(slice),包括切片的概念、如何定义切片、从已有数组生成新切片、切片的字面量初始化、切片的追加与修改、以及切片的访问方式。重点讨论了切片的动态扩容机制,指出当容量不足时,Go会自动翻倍容量,并通过实例展示了切片在内存地址上的变化。此外,还探讨了通过指针操作切片以保持数据共享的情况。
摘要由CSDN通过智能技术生成

GoLang基础数据类型-切片(slice)详解

作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求。在初始定义数组时,我们并不知道需要多大的数组,因此我们就需要“动态数组”。在Go里面这种数据结构叫slice,slice并不是真正意义上的动态数组,而是一个引用类型。slice总是指向一个底层array,slice的声明也可以像array一样,只是不需要长度,它是可变长的,可以随时往slice里面加数据。

一.什么是切片(slice)

简单的说,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针。数组切片的数据结构可以抽象为以下3个变量:

1>.一个指向原生数组的指针(point):指向数组中slice指定的开始位置;

2>.数组切片中的元素个数(len):即slice的长度;

3>.数组切片已分配的存储空间(cap):也就是slice开始位置到数组的最后位置的长度。

从底层实现的角度来看,数组切片实际上仍然使用数组来管理元素,基于数组,数组切片添加了一系列管理功能,可以随时动态扩充存放空间,并且可以被随意传递而不会导致所管理的元素被重复复制。

二.定义切片

其实定义一个切片和定义一个数组的方式很相似,不过很有意思的时候切片的定义方式到是蛮有意思的,它比数组要灵活的多,因为我们知道数组的长度和容量一旦在定义之后就无法被修改,但是切片可以,因此相比数组,切片更受程序员欢迎吧,但是我们不能否定数组的重要性,因为从底层实现的角度来看,Golang切片实际上仍然使用数组来管理元素。

1.用make方法初始化切片;

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/

5 EMAIL:y1053419035@qq.com6 */

7

8 package main9

10 import "fmt"

11

12 func my_slice(s string ,x []int) {13 fmt.Printf("`%s`切片的长度为:[%d] 切片容量为:[%d] 切片中的元素是:%v\n",s,len(x),cap(x),x)14 }15

16 func main() {17 var yinzhengjie []int //声明一个名称为“yinzhengjie”的切片,其默认长度均为零,但是可以并不意味着它不能存取更多的元素哟!18 Golang_array := [5]int{1,3,5,7}19 Golang_slice := make([]int,2,5) //表示定义一个长度为“2”,容量为“5”的切片20 fmt.Printf("`%s`数组的长度为:[%d];数组的容量为:[%d];数组的元素是:%v\n","Golang_array",len(Golang_array),cap(Golang_array),Golang_array)21 my_slice("Golang_slice",Golang_slice)22 my_slice("yinzhengjie",yinzhengjie)23 yinzhengjie = append(yinzhengjie, 100,200,300) //尽管之前的“yinzhengjie”这个切片长度为0,但是仍然可以往里面追加更多的元素。24 my_slice("yinzhengjie",yinzhengjie)25 }26

27

28

29 #以上代码执行结果如下:

30 `Golang_array`数组的长度为:[5];数组的容量为:[5];数组的元素是:[1 3 5 70]31 `Golang_slice`切片的长度为:[2] 切片容量为:[5] 切片中的元素是:[0 0]32 `yinzhengjie`切片的长度为:[0] 切片容量为:[0] 切片中的元素是:[]33 `yinzhengjie`切片的长度为:[3] 切片容量为:[4] 切片中的元素是:[100 200 300]

2.用已有数组生成新切片

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/

5 EMAIL:y1053419035@qq.com6 */

7

8 pa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值