学习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. 【命令汇总】nmap 使用教程

    日期:2019-07-03 21:23:39 更新: 作者:Bay0net 介绍:汇总一下笔记里面的 nmap 使用方式 0x01. 基本信息 Nmap: the Network Mapper - F ...

  2. fixture之autouse=True

    平常写自动化用例会写一些前置的fixture操作,用例需要用到就直接传该函数的参数名称就行了.当用例很多的时候,每次都传这个参数,会比较麻烦.fixture里面有个参数autouse,默认是Fasle ...

  3. 系统分析与设计HW5

    个人作业 领域建模 a. 阅读 Asg_RH 文档,按用例构建领域模型. 按 Task2 要求,请使用工具 UMLet,截图格式务必是 png 并控制尺寸 说明:请不要受 PCMEF 层次结构影响.你 ...

  4. springboot文件上传报错

    异常信息: org.springframework.web.multipart.MultipartException: Could not parse multipart servlet reques ...

  5. IntelliJ IDEA Default Keymap (idea 快捷键)

  6. python2和python3中split的坑

    执行同样的split,python2和python3截取的行数内容却不一样 我想要截取Dalvik Heap行,使用split('\n')的方法 import os cpu='adb shell du ...

  7. TCP网络编程(Socket通讯)

    TCP 网路编程: 1.TCP 三次握手: 第一次握手,客户端向服务器端发出连接请求,等待服务器确认. 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求. 第三次握手,客户端再次向服 ...

  8. MySQL学习-数据库设计以及sql的进阶语句

    1.数据库设计 关系型数据库建议在E-R模型的基础上,我们需要根据产品经理的设计策划,抽取出来模型与关系,制定出表结构,这是项目开始的第一步 在开发中有很多设计数据库的软件,常用的如power des ...

  9. Neither abstinence nor excess ever renders man happy

    inch.n. 英寸 courageous.adj.勇敢的 porcelain.n.瓷器 adj.脆的 inventor. n. 发明者 trivial.adj. 不重要的 grove.n.小树林,果 ...

  10. 【DSP开发】【Linux开发】基于ARM+DSP进行应用开发

    针对当前应用的复杂性,SOC芯片更好能能满足应用和媒体的需求,集成众多接口,用ARM做为应用处理器进行多样化的应用开发和用户界面和接口,利用DSP进行算法加速,特别是媒体的编解码算法加速,既能够保持算 ...