(二十六)golang--切片
2024-09-01 16:49:25
基本介绍:
- 切片是数组的引用;
- 切片的使用和数组类似;
- 切片的长度是可以变化的;
- 切片的定义 var a []int,注意和数组定义的区别;
切片不仅可以使用len函数,还有cap函数来计算切片的容量;
切片在内存中的形式:
从该图我们可以得出:
- slice的确是一个引用类型;
- slice从底层来说,其实就是一个数据结构struct:
type slice sruct {
ptr *[2]int
len int
cap int
}
切片使用的三种方式:
- 即上面的对数组的操作;
- 通过make来创建切片;var slice []int = make([]int,4,20)三个参数分别是类型,长度,容量
- 定义一个切片,直接就指定数组;var slice []int = []int{1,3,5}
方式1和方式2的区别:
方式1是直接引用数组,这个数组是事先存在的,程序员是可见的;方式2通过make,make也会创建一个数组,是由切片在底层进行维护,对程序员是不可见的;
切片的遍历:与数组一样,也是有两种;
切片使用的注意事项:
- 切片定义后需要引用到一个数组或者make一个空间供切片使用;
- 切片之后可以继续切片;
- append内置函数,可以动态增加切片;
var slice []int = []int{1,2,3}
slice = append(slice,4,5,6)
slice = append(slice,slice...);注意三个...是固定操作
切片append底层原理分析:
(1)切片append本质上是对数组扩容;
(2)go语言会创建一个新的数组(扩容后)
(3)将slice原来包含的元素拷贝到新的数组;
(4)slice重新引用到新数组;
(5)新数组是在底层来维护的,程序员不可见;
切片的拷贝操作:
切片使用copy内置函数完成拷贝;
intArr和intArr2空间是相互独立的,相互之间不会影响;
若元素不够,则只拷贝一部分;
string和切片的关系:
(1)string底层实现是一个byte数组,因此string也可以进行切片;
(2)string是不可变的;
(3)如果要修改字符串,先要将string-->[]byte,或者[]rune-->修改-->重写装成string;要替换中文,用[]rune;
最新文章
- 条件编译#if
- springmvc4环境简单搭建和定时任务
- svn bug
- ubuntu 配置 jdk的一些常见问题
- 使用python的redis 实现消息的pub/sub功能
- 获取DataTable选择第一行某一列值
- BZOJ 2301 【HAOI2011】 Problem b
- 65. Reverse Integer &;&; Palindrome Number
- 7、8上的cell上的一个按钮,当点击按钮时,要拿到这个cell,可以用代理,也可以用superview
- 【转】在delphi中实现控件的拖拽
- Confluence Wiki Markup &; Markdown
- Leeo 智能夜灯:默默守护你的家
- 分享功能使用的UIPopoverController在iOS9 过期,替换为popoverPresentationController
- Spring MVC(二)
- c# winform 点击按钮切换tabcontrol标签
- 201621123060《JAVA程序设计》第一周学习总结
- Postgres中postmaster代码解析(中)
- 一次jdk1.7升级jdk1.8后导致redis运行时blocked_clients过多问题解决
- 1.搭建Angular2项目
- python----动态规划