【一 Go 到底】第二十九天 --- 切片入门
一、切片基本介绍
1.1 切片的基本概念
切片是驻足的一个引用,因此切片是引用类型,在进行传递的时候,遵守引用传递机制
切片的使用和数组类似,
遍历切片、访问切片的元素以及求切片长度len(slice)都一样
切片长度可变,可以看作是一个动态数组
1.2 基本语法
1.3 快速上手案例
1.4 切片在内存中的形式
从 1.3 例中可以看到
slice 是一个引用类型
slice 从底层来说,是一个数据结构(struct 结构体)
二、切片的使用
2.1 方式一
先定义切片,再引用数组(如 1.3)
2.2 方式二
通过 make 创建切片
2.2.1 基本语法
type 就是切片类型
len 是切片大小
cap 为切片容量(可选参数)
2.2.2 make 快速上手案例
2.2.2 总结
make 方式创建切片可以指定切片大小和容量
若没有给切片元素赋值,那么会使用默认值
make 方式创建的切片对应的数组由 make 维护,对外不可见,只能通过 slice 去访问各个元素
2.3 方式三
定义切片,直接指定数组,类似 make
2.3.1 语法
2.3.2 快速上手案例
3.不同方式的区别
三、切片遍历
for 和 for-range 遍历
四、切片注意事项、细节
4.1 注意事项及细节
切片初始化时 var slice = arr[startIndex:endIndex]
说明
:从 arr 数组 下标为 startIndex,取到下标为 endIndex 的元素(不含 arr[endIndex])。-----前闭后开
切片初始化时,仍然不能越界。范围在[0-len(arr)] 之间,但是可以动态增长.
var slice = arr[0:end]可以简写 var slice = arr[:end]
var slice = arr[start:len(arr)]可以简写: var slice = arr[start:]
var slice = arr[0:len(arr)]可以简写: var slice = arr[:]
cap 是一个内置函数,用于统计切片的容量,即最大可以存放多少个元素。
切片定义完后,还不能使用,因为本身是一个空的,需要让其引用到一个数组,或者 make-一个空间供切片来使用。 详见案例一
切片可以继续切片
用 append 内置函数,可以对切片进行动态追加。详见案例二切片 append 操作的底层原理分析:
1)切片 append 操作的本质就是对数组扩容
2) go 底层会创建一-下新的数组 newArr(安装扩容后大小
3)将 slice 原来包含的元素拷贝到新的数组 newArr
4) slice 重新引用到 newArr
5)注意 newArr 是在底层来维护的,程序员不可见.
6)案例演示说明
切片使用 copy 内置函数完成拷贝.详见案例三
进行拷贝时,要求 copy()中的 2 个参数都必须是切片类型
数据空间是相互独立的,互不影响
make 创建的切片容量小于数组容量,可以进行 copy。详见案例四
切片是引用类型,在传递值时,遵循引用传递机制。详见案例五
4.2 案例分析
4.2.1 案例一 make
4.2.2 案例二 append
4.2.4 案例三 copy
4.2.5 案例四 copy
4.2.6 案例五
五、string 和 slice 关系
5.1 string 简介
string 底层是一个 byte 数组,因此 string 也可以进行切片处理
string 是不可变的,也就说不能通过 str[0]= 'z'方式来修改字符串
如果需要修改字符串,可以先将 string -> []byte /或者[]rune-> 修改->重写转成 string.
5.2 string 案例演示
5.2.1 案例一 string 切片
5.2.2 案例二 修改字符串
六、切片练习
6.1 斐波那契数列
说明:编写一个函数 fbn(n int) ,要求完成
1)可以接收一个 n int
2)能够将斐波那契的数列放到切片中
3)提示, 斐波那契的数列形式:
arr[0]= 1; arr[1]= 1; arr[2]=2; arr[3]= 3; arr[4]=5; arr[5]=8
6.2
版权声明: 本文为 InfoQ 作者【指剑】的原创文章。
原文链接:【http://xie.infoq.cn/article/2d0ba9089dd6f213752ec4dd2】。文章转载请联系作者。
评论