学习Golang语言(1): Hello World

学习Golang语言(2): 变量

学习Golang语言(3):类型--布尔型和数值类型

学习Golang语言(4):类型--字符串

学习Golang语言(5):类型--数组

学习Golang语言(6):类型--切片

在非常多应用场景中,数组不能够满足我们的需求。在初始定义数组时,我们并不知道数组所需的长度。因此,我们须要一个大小能够动态变化的数组(动态数组)

在Go语言中,这样的“动态数组”成为slice(切片)。

可是实际上slice并非真正意义上的动态数组,而是一个引用类型。slice总是指向一个底层array,slice的声明能够像array一样。

可是它不须要声明长度。slice的长度是可变的。

严格来讲。slice有两个属性容量(capacity)和长度(length),当中容量>=长度。

切片(slice)的声明

切片能够通过下面方式创建。

1、先声明一个变量是切片,再使用内置函数make去初始化这个切片。

    

这里首先使用make函数定义切片slice1。这个时候slice1的容量=5。长度=5;然后使用make函数定义切片slice2。这个时候slice2的容量=10,长度=5。

因此能够看出使用make定义切片有两种方式。

  • 仅仅指定长度,这个时候切片长度和容量同样;

  • 同一时候指定切片的长度和容量。

--------------------注意--------------------

1、在容量大于长度时候,赋值仍须要注意最大的索引仍然是len(slice)-1,否则会报索引超出边界的错误。

2、使用:=符号在声明一个切片同一时候初始化数据,例如以下所看到的。

slice := []byte{'a','b','c','d','e'}

3、切片能够从数组或者一个已经存在的slice中再次声明。

切片通过array[i:j]来获取数组index从i到j之间的元素。当中i是開始的位置,j是借宿的位置。

可是不包括array[j]。长度为j-i。

---------------------------------------------

此外:数组声明时候方括号内须要写明数组的长度或者使用(...)符号自己主动计算长度。而切片声明时。方括号内没有不论什么字符。

切片另一些简便的操作

  • 切片默认開始位置为0,slice[:n]等价于slice[0:n];

  • 切片的第二个序列默认是数组的长度,slice[n:]等价于slice[n:len(slice)];

  • 假设从一个数组里面直接获取切片。能够这样slice[:],由于默认第一序列为0,第二个序列为len(slice),因此slice[:]等价于slice[0:len(slice)]。

比如:

输出结果:


由于切片是引用类型。因此当引用改变当中元素的值时候,其它的全部引用都会改变该值。比如:

输出结果

当我们把slice1[3]改动为100时候,slice2[0]也变为100.

---------------------------------------------

从概念上看,切片像是一个结构体,包括了三个元素:

  • 一个指向数组中切片指定的開始位置;

  • 长度。即切片的长度,通过内置函数len获得;

  • 最大长度,即切片的最大容量。通过内置函数cap获得。

---------------------------------------------

切片的重要特征:长度可变,能够通过下面样例了解。

append追加元素

输出结果

这里我们初始化slice为容量=8。长度=4的切片。然后为前四个元素赋值并输出结果。

再者使用Go的内置函数append为slice追加6个元素。

这个时候查看slice的容量=16和长度=10以及切片元素。发现slice的长度确实变化。

--------------------注意--------------------

append进行追加元素时

  • 假设新的切片长度小于容量则不会改变容量。

  • 假设新的切片长度将超过容量。Go会自己主动又一次为切片分配容量。

    容量大小为原先的两倍。

上述样例看出:容量从原先的8=>16.

---------------------------------------------

上面介绍了使用append函数给切片添加元素,如今再来介绍一个copy函数:用来从一个切片拷贝元素到另一个切片。

copy复制元素

输出结果

在上面的样例中,我们将slice1的元素复制到slice2,由于slice2的长度为5,因此最多拷贝5个元素。

--------------------总结--------------------

数组声明时候方括号内须要写明数组的长度或者使用(...)符号自己主动计算长度。

而切片声明时,方括号内没有不论什么字符。

由于数组长度固定。而切片长度可变。

---------------------------------------------

欢迎关注码术!一起学习Golang语言。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZW1hbnNoaXA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="font-size:14px;" />

学习Golang语言(6):类型--切片的更多相关文章

  1. 深入学习golang(1)—数组与切片

    数据(array)与切片(slice) 数组声明: ArrayType   = "[" ArrayLength "]" ElementType . 例如: va ...

  2. [Golang学习笔记] 07 数组和切片

    01-06回顾: Go语言开发环境配置, 常用源码文件写法, 程序实体(尤其是变量)及其相关各种概念和编程技巧: 类型推断,变量重声明,可重名变量,类型推断,类型转换,别名类型和潜在类型 数组: 数组 ...

  3. Golang 入门系列(二)学习Go语言需要注意的坑

    上一章节我们已经了解了 Go 环境的配置,不了解的,请查看前面的文章 https://www.cnblogs.com/zhangweizhong/p/9459945.html,本章节我们将学习 Go ...

  4. go语言学习之路三:切片

    前面讲了变量的有关知识,这里对于其他的数据类型就不多作介绍,(和C差不多),因此重点来讨论下切片. 一.切片是引用类型,这里要稍微介绍两个概念:值类型,构造类型和引用类型 1.值类型:是一种由类型的实 ...

  5. GO学习-(9) Go语言基础之切片

    Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...

  6. Go语言数组和切片的原理

    目录 数组 创建 访问和赋值 切片 结构 初始化 访问 追加 拷贝 总结 数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念,数组作为最常见的集合在编程语言中是 ...

  7. go 学习笔记之数组还是切片都没什么不一样

    上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特 ...

  8. golang语言初体验

    Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型.编译型语言.Go 语言语法与 C 相近,但功能上 ...

  9. go学习笔记-语言基础

    语言基础 结构 基础组成: 包声明 引入包 函数 变量 语句 & 表达式 注释 程序 在开始编写应用之前,我们先从最基本的程序开始,在学习大部分语言之前,都会编写一个可以输出hello wor ...

随机推荐

  1. node.js入门学习(二)MIME模块,request和response对象,demo之不同url请求不同html页面,页面包含图片、样式css等静态资源

    一.构建http服务程序-根据不同请求做出不同响应 // 加载http模块 var http = require("http"); // 创建一个http服务对象 http.cre ...

  2. 通过web传大文件

    上传文件的jsp中的部分 通过form表单向后端发送请求 <form id="postForm" action="${pageContext.request.con ...

  3. 举例子说明ubuntu中remove,autoremove,purge区别

    转自:慎用 apt-get autoremove !   apt-get 提供了一个用于下载和安装软件包的简易命令行界面.卸载软件包主要有这3个命令 remove – 卸载软件包autoremove ...

  4. 【Python】学习笔记三:序列

    sequence(序列) sequence(序列)是一组有序的元素的集合,序列可以有任何元素,也可以没有元素 元组与表的区别:一旦建立,tuple的各个元素不可再变更,而list的各个元素可以再变更 ...

  5. phpstorm的下载激活及定制使用和设置

    1.下载地址: 链接:https://pan.baidu.com/s/19PbZnzq0x7grgBge-iHI3w&shfl=sharepset  提取码:dnte 2.激活码获取:http ...

  6. Spring 缓存注解 SpEL 表达式解析

    缓存注解上 key.condition.unless 等 SpEL 表达式的解析 SpEl 支持的计算变量: 1)#ai.#pi.#命名参数[i 表示参数下标,从 0 开始] 2)#result:Ca ...

  7. 将ubuntu系统录到u盘上

    可以使用bootice工具对u盘分区,并隐藏,然后把系统录到隐藏分区,ubuntu只需要1.5G即可.bootice很强大 录制工具可选的有Universal USB Install.UltraISO ...

  8. centos官网镜像下载方法

    1.CentoS简介 CentOS(Community Enterprise Operating System,社区企业操作系统)是一个基于Red Hat Linux 提供的可自由使用源代码的企业级L ...

  9. laravel 5.6 使用RabbitMQ作为消息中间件

    1.Composer安装laravel-queue-rabbitmqcomposer require vladimir-yuldashev/laravel-queue-rabbitmq2.在confi ...

  10. 关于win10系统如何调用debug查看CPU汇编指令和内存

    下载安装DOSBox.网上提供下载地址:DOSBOX Debug是DOS(Disk Operating System,磁盘操作系统).windows提供的实模式(8086方式)程序的调试工具.使用它, ...