切片和数组很类似,甚至你可以理解成数组的子集。但是`切片有一个数组所没有的特点,那就是切片的长度是可变的`。

严格地讲,切片有`容量(capacity)`和`长度(length)`两个属性。

首先我们来看一下切片的定义。切片有两种定义方式,一种是先声明一个变量是切片,然后使用内置函数make去初始化这个切片。另外一种是通过取数组切片来赋值。

 1 package main
 2
 3     import (
 4         "fmt"
 5     )
 6
 7     func main() {
 8         var x = make([]float64, 5)
 9         fmt.Println("Capcity:", cap(x), "Length:", len(x))
10         var y = make([]float64, 5, 10)
11         fmt.Println("Capcity:", cap(y), "Length:", len(y))
12
13         for i := 0; i < len(x); i++ {
14             x[i] = float64(i)
15         }
16         fmt.Println(x)
17
18         for i := 0; i < len(y); i++ {
19             y[i] = float64(i)
20         }
21         fmt.Println(y)
22     }

输出结果为

Capcity: 5 Length: 5
Capcity: 10 Length: 5
[0 1 2 3 4]
[0 1 2 3 4]

上面我们首先用make函数定义切片x,这个时候x的容量是5,长度也是5。然后使用make函数定义了切片y,这个时候y的容量是10,长度是5。然后我们再分别为切片x和y的元素赋值,最后输出。

所以使用make函数定义切片的时候,有`两种方式`,一种`只指定长度,这个时候切片的长度和容量是相同的`。另外一种是`同时指定切片长度和容量`。虽然切片的容量可以大于长度,但是`赋值的时候要注意最大的索引仍然是len(x)-1`。否则会报索引超出边界错误。

另外一种是通过数组切片赋值,采用`[low_index:high_index]`的方式获取数值切片,其中切片元素`包括low_index的元素`,但是`不包括high_index的元素`。

 1 package main
 2
 3     import (
 4         "fmt"
 5     )
 6
 7     func main() {
 8         var arr1 = [5]int{1, 2, 3, 4, 5}
 9         var s1 = arr1[2:3]
10         var s2 = arr1[:3]
11         var s3 = arr1[2:]
12         var s4 = arr1[:]
13         fmt.Println(s1)
14         fmt.Println(s2)
15         fmt.Println(s3)
16         fmt.Println(s4)
17     }

输出结果为

[3]
[1 2 3]
[3 4 5]
[1 2 3 4 5]

在上面的例子中,我们还省略了low_index或high_index。如果省略了low_index,那么等价于从索引0开始;如果省略了high_index,则默认high_index等于len(arr1),即切片长度。

这里为了体现切片的长度可以变化,我们看一下下面的例子:

 1 package main
 2
 3     import (
 4         "fmt"
 5     )
 6
 7     func main() {
 8         var arr1 = make([]int, 5, 10)
 9         for i := 0; i < len(arr1); i++ {
10             arr1[i] = i
11         }
12         fmt.Println(arr1)
13
14         arr1 = append(arr1, 5, 6, 7, 8)
15         fmt.Println("Capacity:", cap(arr1), "Length:", len(arr1))
16         fmt.Println(arr1)
17     }

输出结果为

[0 1 2 3 4]
Capacity: 10 Length: 9
[0 1 2 3 4 5 6 7 8]

这里我们初始化arr1为容量10,长度为5的切片,然后为前面的5个元素赋值。然后输出结果。然后我们再使用Go内置方法append来为arr1追加四个元素,这个时候再看一下arr1的容量和长度以及切片元素,我们发现切片的长度确实变了。

另外我们再用`append`方法给arr1多追加几个元素,试图超过arr1原来定义的容量大小。

 1 package main
 2
 3     import (
 4         "fmt"
 5     )
 6
 7     func main() {
 8         var arr1 = make([]int, 5, 10)
 9         for i := 0; i < len(arr1); i++ {
10             arr1[i] = i
11         }
12
13         arr1 = append(arr1, 5, 6, 7, 8, 9, 10)
14         fmt.Println("Capacity:", cap(arr1), "Length:", len(arr1))
15         fmt.Println(arr1)
16     }

输出结果为

Capacity: 20 Length: 11
[0 1 2 3 4 5 6 7 8 9 10]

我们发现arr1的长度变为11,因为元素个数现在为11个。另外我们发现arr1的容量也变了,变为原来的两倍。这是因为`Go在默认的情况下,如果追加的元素超过了容量大小,Go会自动地重新为切片分配容量,容量大小为原来的两倍`。

上面我们介绍了,可以`使用append函数给切片增加元素`,现在我们再来介绍一个`copy函数用来从一个切片拷贝元素到另一个切片`。

 1 package main
 2
 3     import (
 4         "fmt"
 5     )
 6
 7     func main() {
 8         slice1 := []int{1, 2, 3, 4, 5, 6}
 9         slice2 := make([]int, 5, 10)
10         copy(slice2, slice1)
11         fmt.Println(slice1)
12         fmt.Println(slice2)
13     }

输出结果

[1 2 3 4 5 6]
[1 2 3 4 5]

在上面的例子中,我们将slice1的元素拷贝到slice2,因为slice2的长度为5,所以最多拷贝5个元素。

总结一下,数组和切片的区别就在于`[]`里面是否有数字或者`...`。因为数值长度是固定的,而切片是可变的。

转载于:https://www.cnblogs.com/cuibin/p/6752328.html

Golang学习笔记——Slice相关推荐

  1. golang学习笔记(基础篇)

    LCY~~Golang学习笔记 一.Go语言开发环境 ##安装Go开发包以及VsCode Go开发包与vscode配置安装教程网址:https://www.liwenzhou.com/posts/Go ...

  2. Golang学习笔记之GORM基础使用(二)

    本文章主要学习GORM的增删查改.若还没有完成数据库和数据表的创建.定义模型以及数据库的连接请先学习本本专栏文章Golang学习笔记之GORM基础使用(一).本文为学习笔记,通过GORM官方中文文档和 ...

  3. 118云原生编程语言Golang学习笔记

    Golang学习笔记 文章目录 1.Go简介 1.1 简介 1.2 设计初衷 1.3 Golang vs Java 1.4 应用领域 1.5 用go语言的公司 2.Go下载和安装 2.1 开发工具 2 ...

  4. golang学习笔记之--Go语言内建容器

    话接上文 <golang学习笔记之--Go语言基本语法> 今天继续记录学习笔记,今天的笔记主题是Go语言内建容器 如果各位童鞋想要获得下面的源码,请搜索gzh:隔壁王小猿,关注后回复&qu ...

  5. golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题

    golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...

  6. golang学习笔记(五):数组的定义和使用

    golang 学习笔记 数组定义 数组是一系列相同数据类型在内存中有序存储的数据集合 var 数组名 [元素个数]数据类型//定义了10个整型变量的数组元素var arr [10]int//通过下标找 ...

  7. golang学习笔记(十六):多态的实现

    golang 学习笔记 多态实现 package main import "fmt"//先定义接口 在根据接口实现功能 type Humaner1 interface {//方法 ...

  8. golang学习笔记-1

    golang学习笔记-1 自学golang时,找到一篇学习资料http://golang.iswbm.com/en/latest/c01/c01_08.html 初看上面两种写法,不明就里,哪里高级了 ...

  9. golang学习笔记8 beego参数配置 打包linux命令

    golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架 https://beego.me/docs/mvc/contr ...

最新文章

  1. Java之线程同步练习
  2. 卷积神经网络, Convolutional Neural Networks , CNN
  3. Linux学习:目录遍历函数
  4. java.lang.IllegalStateException: getOutputStream() has already been called for this response
  5. Iptables入门教程
  6. 计算机网络【四】数据链路层基本概念+点到点通信(PPP协议)
  7. CSS中的px与物理像素、逻辑像素、1px边框问题
  8. mac的终端通过ssh远程连接Linux服务器
  9. 【多任务】多任务学习在推荐算法中的应用
  10. linux6.5关闭21端口,linux CentOS6.5 防火墙(关闭除提供系统服务以外的端口)
  11. 几款开源的Windows界面库
  12. GitHub 车牌检测识别项目调研
  13. java 中文车牌识别_EasyPR-Java开源中文车牌识别系统工程部署
  14. 一个广告资源运营管理中台系统简介
  15. 微软产品界面配色方案分析
  16. 计算机1级考试试题ps,2016年计算机等级考试一级ps模拟练习题及答案
  17. 8.称呼/no/not/meet/nice/of/倒装句/介绍他人的方式/see
  18. 计算机工作区如何删除,Windows Ink工作区是什么,怎么打开/关闭Windows Ink?
  19. 设计公司如何做好产品设计
  20. linux coredump

热门文章

  1. Boost:在GPU上对int的std :: vector进行排序
  2. DCMTK:测试ConcatenationCreator类
  3. VTK:PolyData之GeometryFilter
  4. VTK:模型之Spring
  5. OpenCV使用dnn重新着色灰度图像的实例(附完整代码)
  6. C语言spirograph算法图形绘制(附完整源码)
  7. QT的QStyleOption类的使用
  8. QT的QQmlProperty类的使用
  9. 看代码的软件_软件著作权申请中常见的补正问题及解决方式
  10. python 排列组合_python解决排列组合