学习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. HTML5 大文件断点续传完整思路整理

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  2. 2018百度之星初赛B轮 p1m2

    p1m2 Accepts: 954 Submissions: 4063 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/1310 ...

  3. C++中string常用函数用法总结

    string(s小写)是C++标准库中的类,纯C中没有,使用时需要包含头文件#include<string>,注意不是<string.h>,下面记录一下string中比较常用的 ...

  4. 人工智能之基于Opencv与深度学习的计算机视觉实战课程

    https://www.bilibili.com/video/av66375362 imagewatch:https://blog.csdn.net/iracer/article/details/83 ...

  5. D. Print a 1337-string...

    D. Print a 1337-string... 输出一个字符串 里面包含n个子序列 1337 #include<bits/stdc++.h> using namespace std; ...

  6. Oracle JET mobile cordove navigator.app对象

    在使用 Oracle JET 开发 webapp 时,会使用到 ojrouter ,ojrouter 默认含有历史记录推送功能.在调试 Android 时会发现返回键总是返回到上一次浏览记录(App ...

  7. leetcode-mid-array-sorting and searching - 215 Kth Largest Element in an Array

    mycode  77.39% class Solution(object): def findKthLargest(self, nums, k): """ :type n ...

  8. JavaScript基础篇详解

    全部的数据类型: 基本数据类型: undefined Number Boolean null String 复杂数据类型: object ①Undefined: >>>声明但未初始化 ...

  9. 使用 circleci 自动部署 vuepress 到 github

    概述 今天我想把博客什么的搬到 github 的 vuepress 上面.但是每次提交 md 文件需要手动打包然后再提交到 github 的 gh-pages,非常麻烦.所以我去研究了一下用 circ ...

  10. 阶段3 1.Mybatis_11.Mybatis的缓存_6 Mybatis中的一级缓存

    Mybatis中的一级缓存和二级缓存         一级缓存:             它指的是Mybatis中SqlSession对象的缓存.             当我们执行查询之后,查询的结 ...