golang 常用手册之切片 (Slice) 原理
这里有新鲜出炉的 GO 语言教程, 程序狗速度看过来!
Go 语言
Go 是一种新的语言, 一种并发的带垃圾回收的快速编译的语言 Go 是谷歌 2009 年发布的第二款编程语言 2009 年 7 月份, 谷歌曾发布了 Simple 语言, 它是用来开发 Android 应用的一种 BASIC 语言
本篇文章主要介绍了 golang 常用手册之切片 (Slice) 原理, 小编觉得挺不错的, 现在分享给大家, 也给大家做个参考一起跟随小编过来看看吧
切片, 这是一个在 go 语言中引入的新的理念它有一些特征如下:
对数组抽象
数组长度不固定
可追加元素
切片容量可增大
容量大小成片增加
我们先把上面的理念整理在这里, 但是实际的还是要撸码来解决问题
定义或申明切片
首先我们看看申明切片:
var sliceName[] type
定义完成后, 我们需要定义切片:
sliceName = make([] type, len)
也可以适当简写:
sliceName: =make([] type, len)
在上面的例子中, 我们申明了一个切片, 我们现在先运行看看结果
- package main
- import "fmt"
- func main() {
- sliceName := make([]string, 3)
- fmt.Printf("切片 slice_name 的长度: len=%d \n", len(sliceName))
- }
- // 运行结果如下:
- /*
- * 切片 slice_name 的长度: len=3
- */
那么看到这里小伙伴们是不是发现切片, 也就是我们普通的一个数组, 那么它凭什么叫做切片呢?
我么可以看到另外一个 make 函数: make([]T, length, capacity)
在上面的 capacity 是数组的容量, length 则是数组的长度当新插入元素后长度超过容量, 则会自动增加一个容量来填装数据, 但是 切片的空间大小是 capacity 的整数倍 demo 如下:
- package main
- import "fmt"
- func main() {
- sliceName := make([]string, 3, 15)
- fmt.Printf("切片 slice_name 的长度: len=%d cap=%d \n", len(sliceName), cap(sliceName))
- sliceName[0] = "程先生"
- fmt.Println(sliceName)
- // 运行结果如下:
- /*
- * 切片 slice_name 的长度: len=3 cap=15
- * [程先生 ]
- */
- }
初始化切片
任何变量或常量在使用之前都需要初始化, 不过常量是直接把申明和初始化写在一起的我们来看看切片的初始化:
- // 初始化数组
- arr := [] int{1, 2, 3}
- fmt.Println(arr)
- // 初始化切片 sliceName 是 数组 arr 的引用
- sliceName := arr[:]
- fmt.Println(sliceName)
- // 当然切片引用数组的标准写法是: s := arr[startIndex:endIndex]
- // 其中 startIndex 和 endIndex 都可以省略
- // 省缺 startIndex 则是数组下标为 0,endIndex 省略则是下标为 len-1
- // 运行结果如下:
- //[1 2 3]
- //[1 2 3]
- sliceName1 := arr[1:3]
- fmt.Println(sliceName1)
- // 截取切片元素下标从 1 开始到 3 但是并不包括 3 并复制给切片 sliceName1
- // 运行结果:[2 3]
当然切片也会存在空对象 nil 的情况, 在你申明后不初始化的情况下则会产生 nil
切片的增删改查
当我们创建了一个切片后, 我们需要对切片的元素进行增加该怎么办呢? 我们可以看到内置 append 函数: func append(slice []Type, elems ...Type) []Type, 代码如下:
- // 首先我们需要先把原来的切片和欲添加元素作为参数加入到 append 函数中,
- // 并且 append 会返回一个新的切片, 所以代码如下:
- sliceName = append(sliceName, 4) fmt.Println(sliceName)
- // 运行结果如下:
- // [1 2 3 4]
当然我们顺带看下 copy 函数如下:
- // The copy built-in function copies elements from a source slice into a destination slice.
- // Copy returns the number of elements copied, which will be the minimum of len(src) and len(dst).
- func copy(dst, src []Type) int
- // 上面的说明中指出 我们目标切片接受源数组, 并且返回被拷贝的元素个数
当然, go 语言并没有提供内置的 remove 函数, 但是我们可以通过 append 函数实现, 如下:
- // 移除某个 position 的元素
- // 主要思路就是把该位置之前的数据和后面的数据组合到一起并赋值给原先的数组
- sliceName = append(sliceName[: position], sliceName[position + 1 : ]...)
总结
切片其实就是数组
切片的数组大小是能够变化的
切片的容量增加是整数倍的
任何对象都有可能为空 nil
内置函数 append 和 copy 的使用
来源: http://www.phperz.com/article/18/0217/362574.html