学习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. EF大数据插入

    _April给出代码: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotati ...

  2. SQL基础-order by

    若sql语句中order by指定了多个字段,则怎么排序? 举个例子吧:order by id desc,time desc 先是按 id 降序排列  (优先)如果 id 字段 有些是一样的话   再 ...

  3. Codeforces Round #287 (Div. 2) E. Breaking Good 路径记录!!!+最短路+堆优化

    E. Breaking Good time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. vue树形菜单

    vue树形菜单 由于项目原因,没有使用ui框架上的树形菜单,所以自己动手并参考大佬的代码写了一个树形菜单的组件,话不多说,直接上代码.html代码js代码直接调用api 把请求到的数据直接赋值给per ...

  5. Http协议:客户端提交数据给服务端和从服务端获得数据,像WebView也是向百度的服务端发出一条Http请求,服务端返回HTML页面,客户端(浏览器)解析后展示出页面

    提交数据和获得数据的方式有很多,这里介绍一种,使用HttpURLConnection来向服务器提交数据或者获得数据. 获得数据: //传入网址,获得请求网页数据(XML文件数据或JSON文件数据) p ...

  6. instanceOf与isInstance()方法之间的区别

    instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化.如果被测对象是null值,则测试结果总是false.Class类的isInstance(Obje ...

  7. iOS 自定义一对UI表现相反的按钮

    假如有一对按钮[重置][提交],要让他们的默认UI和点击的UI表现刚好相反 [提交]按钮,默认橙色,点击边框是橙色,字体是橙色,背景变白色 [重置]按钮,默认白色橙色,边框是橙色,点击字体是白色,背景 ...

  8. 洛谷P1198 [JSOI2008]最大数(单点修改,区间查询)

    洛谷P1198 [JSOI2008]最大数 简单的线段树单点问题. 问题:读入A和Q时,按照读入一个字符会MLE,换成读入字符串就可以了. #include<bits/stdc++.h> ...

  9. nginx回源使用localhost产生问题

    最近测试ngx_http_slice模块,回源的时候填的localhost结果老是超时,还以为是slice模块有问题,后来无意间改成127.0.0.1后就没有问题了 真是见鬼了 #user root; ...

  10. C++获取寄存器eip的值

    程序中需要打印当前代码段位置 如下 #include <stdio.h> #include <stdlib.h> #include <math.h> #ifdef ...